0Pricing
C Academy · Ders

Karşılaştırıcılarla qsort

Standart kitaplık geri çağrıları

Karşılaştırıcılarla qsort, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

Standart qsort

Standart kütüphane, <stdlib.h> içinde qsort işlevini sağlar. Bu işlev, bir karşılaştırıcı geri çağrısı kullanarak her dizi türünde çalışan genel bir sıralamadır.

#include <stdio.h>
#include <stdlib.h>

int cmp_int(const void *a, const void *b) {
    int x = *(const int *)a;
    int y = *(const int *)b;
    return (x > y) - (x < y);
}

int main(void) {
    int a[] = {3, 1, 2};
    qsort(a, 3, sizeof(int), cmp_int);
    printf("%d %d %d\n", a[0], a[1], a[2]);
    return 0;
}

qsort İmzası

qsort(base, count, size, compare); dizinin başlangıcını, öğe sayısını, öğe boyutunu ve bir karşılaştırıcıyı alır.

Ham baytlarla ve sizin karşılaştırıcınızla çalıştığı için geneldir.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    return *(const int*)a - *(const int*)b;
}

int main(void) {
    int a[] = {9, 4, 7, 1};
    qsort(a, 4, sizeof(int), cmp);
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

Karşılaştırıcı Sözleşmesi

Karşılaştırıcı, ilk öğe ikinciden önce gelmeliyse negatif, eşitse sıfır, sonra gelmeliyse pozitif bir değer döndürür.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    int x = *(const int*)a, y = *(const int*)b;
    if (x < y) return -1;
    if (x > y) return 1;
    return 0;
}

int main(void) {
    int a[] = {5, 2, 8, 2};
    qsort(a, 4, sizeof(int), cmp);
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

void İşaretçilerini Tür Dönüşümüne Uğratma

Karşılaştırıcı her öğe için const void * alır. Değerleri okumak için bunları doğru türe dönüştürün ve başvurdukları değeri okuyun.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    double x = *(const double*)a;
    double y = *(const double*)b;
    return (x > y) - (x < y);
}

int main(void) {
    double d[] = {2.5, 1.1, 3.3};
    qsort(d, 3, sizeof(double), cmp);
    printf("%.1f %.1f %.1f\n", d[0], d[1], d[2]);
    return 0;
}

Azalan Sıra

Büyükten küçüğe sıralamak için karşılaştırmayı tersine çevirin.

#include <stdio.h>
#include <stdlib.h>

int desc(const void *a, const void *b) {
    int x = *(const int*)a, y = *(const int*)b;
    return (y > x) - (y < x);
}

int main(void) {
    int a[] = {1, 5, 3, 2};
    qsort(a, 4, sizeof(int), desc);
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

Çıkarma Taşmasından Kaçınma

x - y döndürmek, büyük tamsayılarda taşmaya neden olabilir. Güvenli deyim olan (x > y) - (x < y) bunu önler.

#include <stdio.h>
#include <stdlib.h>

int safe_cmp(const void *a, const void *b) {
    int x = *(const int*)a, y = *(const int*)b;
    return (x > y) - (x < y);
}

int main(void) {
    int a[] = {100, -100, 0};
    qsort(a, 3, sizeof(int), safe_cmp);
    for (int i = 0; i < 3; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

Dizeleri Sıralama

char * dizisinde her öğenin kendisi de bir işaretçidir; bu nedenle const char * const * türüne dönüştürün ve strcmp ile karşılaştırın.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp_str(const void *a, const void *b) {
    const char *sa = *(const char * const *)a;
    const char *sb = *(const char * const *)b;
    return strcmp(sa, sb);
}

int main(void) {
    const char *w[] = {"pear", "apple", "fig"};
    qsort(w, 3, sizeof(char*), cmp_str);
    for (int i = 0; i < 3; i++) printf("%s ", w[i]);
    printf("\n");
    return 0;
}

Yapıları Sıralama

qsort yapı dizilerini de işler. Karşılaştırıcı içinde seçtiğiniz bir alanı karşılaştırın.

#include <stdio.h>
#include <stdlib.h>

typedef struct { char name; int age; } Person;

int by_age(const void *a, const void *b) {
    int x = ((const Person*)a)->age;
    int y = ((const Person*)b)->age;
    return (x > y) - (x < y);
}

int main(void) {
    Person p[] = {{'C',30},{'A',20},{'B',25}};
    qsort(p, 3, sizeof(Person), by_age);
    for (int i = 0; i < 3; i++) printf("%c:%d ", p[i].name, p[i].age);
    printf("\n");
    return 0;
}

bsearch de Aynı Fikri Kullanır

bsearch, qsort ile aynı sözleşmeye sahip bir karşılaştırıcı kullanarak sıralanmış bir dizide ikili arama yapar.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    return (*(const int*)a) - (*(const int*)b);
}

int main(void) {
    int a[] = {1, 3, 5, 7, 9};
    int key = 7;
    int *found = bsearch(&key, a, 5, sizeof(int), cmp);
    printf("found: %d\n", found ? *found : -1);
    return 0;
}

Birden Çok Sıralama Anahtarı

Bir karşılaştırıcı önce birincil alanı, ilk alan eşitse ikincil alanı karşılaştırabilir.

#include <stdio.h>
#include <stdlib.h>

typedef struct { int grade; int id; } Rec;

int cmp(const void *a, const void *b) {
    const Rec *x = a, *y = b;
    if (x->grade != y->grade) return x->grade - y->grade;
    return x->id - y->id;
}

int main(void) {
    Rec r[] = {{90,2},{90,1},{80,3}};
    qsort(r, 3, sizeof(Rec), cmp);
    for (int i = 0; i < 3; i++) printf("%d/%d ", r[i].grade, r[i].id);
    printf("\n");
    return 0;
}

Genel Sıralama Neden Önemlidir

qsort algoritmayı karşılaştırmadan ayırdığı için, karşılaştırabildiğiniz her veri türünü tek bir iyi test edilmiş işlevle sıralayabilirsiniz.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    char x = *(const char*)a, y = *(const char*)b;
    return (x > y) - (x < y);
}

int main(void) {
    char s[] = "dcba";
    qsort(s, 4, sizeof(char), cmp);
    printf("%s\n", s);
    return 0;
}

Hızlı Kontrol

qsort karşılaştırıcıları hakkındaki anlayışınızı sınayın.

Özet

qsort'u karşılaştırıcılarla kullanmayı öğrendiniz:

  • qsort(base, count, size, compare) her diziyi genel biçimde sıralar.
  • Karşılaştırıcı iki const void * alır ve negatif, sıfır veya pozitif bir değer döndürür.
  • Taşmayı önlemek için (x > y) - (x < y) kullanın.
  • Aynı karşılaştırıcı sözleşmesi bsearch, yapı sıralamaları ve çok anahtarlı sıralamalar için de kullanılır.

Sıkça Sorulan Sorular

“Karşılaştırıcılarla qsort” dersi ücretsiz mi?

Evet — “Karşılaştırıcılarla qsort” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“Karşılaştırıcılarla qsort” dersinde ne öğreneceğim?

Standart kitaplık geri çağrıları C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Karşılaştırıcılarla qsort” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İşlev İşaretçileri Tanımlama
  2. İşlevleri Geçirme
  3. Karşılaştırıcılarla qsort
  4. İşlev İşaretçisi Tabloları
← C Academy Sayfasına Dön