0Pricing
C Academy · Ders

qsort Kullanımı

Standart kitaplık sıralaması

qsort Kullanımı, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. 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 Kitaplık Sıralaması

C'nin standart kitaplığı, <stdlib.h> içinde qsort sağlar. Bir karşılaştırma işlevi verildiğinde her diziyi sıralar; bu nedenle kendi sıralamanızı yazmanız nadiren gerekir.

qsort İmzası

Prototip şöyledir:

  • base ilk öğeye işaretçi
  • nmemb öğe sayısı
  • size öğe başına bayt sayısı
  • compar bir karşılaştırma işlevi işaretçisi

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

Karşılaştırıcı Yazma

Karşılaştırıcı iki adet const void * alır. Bunları gerçek türe dönüştürün, işaret ettikleri değeri alın ve negatif, sıfır veya pozitif bir değer döndürün.

#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); /* safe, no overflow */
}

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

Karşılaştırıcılarda Çıkarma İşleminden Kaçının

x - y döndürmek, büyük tam sayılarda taşmaya neden olarak hatalı sonuçlar verebilir. Bunun yerine boole farkı deyimini kullanın: (x > y) - (x < y).

#include <stdio.h>

int main(void) {
    int x = 2000000000, y = -2000000000;
    printf("unsafe x-y = %d\n", x - y);          /* overflow */
    printf("safe        = %d\n", (x > y) - (x < y));
    return 0;
}

Azalan Sıra

Azalan sıralama yapmak için karşılaştırma sonucunu tersine çevirmeniz yeterlidir.

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

int cmp_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[] = {5, 2, 9, 1, 3};
    qsort(a, 5, sizeof(int), cmp_desc);
    for (int i = 0; i < 5; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

Dizeleri Sıralama

char * dizisini sıralamak için karşılaştırıcı, işaretçilerin kendilerine işaretçiler alır. const char * const * türüne dönüştürün ve strcmp çağrısı yapın.

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

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

int main(void) {
    const char *names[] = {"charlie", "alice", "bob"};
    qsort(names, 3, sizeof(char *), cmp_str);
    for (int i = 0; i < 3; i++) printf("%s ", names[i]);
    printf("\n");
    return 0;
}

Yapıları Sıralama

Bir yapı dizisini herhangi bir alana göre sıralayabilirsiniz. Burada kişileri yaşlarına göre sıralıyoruz.

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

typedef struct { char name[16]; int age; } Person;

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

int main(void) {
    Person ppl[] = {{"Ann", 30}, {"Ben", 25}, {"Cid", 40}};
    qsort(ppl, 3, sizeof(Person), by_age);
    for (int i = 0; i < 3; i++) printf("%s %d\n", ppl[i].name, ppl[i].age);
    return 0;
}

Çok Anahtarlı Sıralama

Eşitlikleri bozmak için ilk alan eşit olduğunda ikinci alanı karşılaştırın. Bu işlem kişileri önce yaşa, ardından ada göre alfabetik olarak sıralar.

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

typedef struct { char name[16]; int age; } Person;

int cmp(const void *a, const void *b) {
    const Person *p = a, *q = b;
    if (p->age != q->age)
        return (p->age > q->age) - (p->age < q->age);
    return strcmp(p->name, q->name);
}

int main(void) {
    Person ppl[] = {{"Zoe", 30}, {"Amy", 30}, {"Bo", 25}};
    qsort(ppl, 3, sizeof(Person), cmp);
    for (int i = 0; i < 3; i++) printf("%d %s\n", ppl[i].age, ppl[i].name);
    return 0;
}

qsort Kararlı Değildir

C standardı, qsort'un kararlı olmasını gerektirmez. Kararlılığa ihtiyacınız varsa karşılaştırıcınıza özgün dizin gibi bir eşitlik bozucu anahtar ekleyin.

bsearch Eşlikçisi

bsearch, aynı karşılaştırıcı biçimini kullanarak sıralanmış bir dizide ikili arama yapar. Hızlı aramalar için onu qsort ile birlikte kullanın.

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

int cmp_int(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[] = {1, 3, 5, 7, 9};
    int key = 7;
    int *found = bsearch(&key, a, 5, sizeof(int), cmp_int);
    printf("%s\n", found ? "found" : "missing");
    return 0;
}

qsort Neden Kullanılır

Standart qsort iyi test edilmiştir, çoğu zaman ayarlanmış bir iç sıralama bileşimidir ve her tür üzerinde çalışır. Kendi sıralamanızı yalnızca kararlılığa veya kitaplığın sağlayamayacağı özel bir davranışa ihtiyaç duyduğunuzda yazın.

Hızlı Kontrol

qsort'u ne kadar anladığınızı test edin.

Özet

Standart kitaplık sıralamasını kullanmayı öğrendiniz.

  • qsort(base, nmemb, size, compar) her diziyi sıralar
  • Karşılaştırıcılar const void * değerlerini dönüştürür ve karşılaştırmanın işaretini döndürür
  • Çıkarma işleminden kaçının; (x > y) - (x < y) kullanın
  • qsort için kararlılık garantisi yoktur; bsearch onun arama eşlikçisidir

Sıkça Sorulan Sorular

“qsort Kullanımı” dersi ücretsiz mi?

Evet — “qsort Kullanımı” 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.

“qsort Kullanımı” dersinde ne öğreneceğim?

Standart kitaplık sıralaması 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 4. dersidir.

“qsort Kullanımı” 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. Kabarcık ve Eklemeli Sıralama
  2. Quicksort
  3. Mergesort
  4. qsort Kullanımı
← C Academy Sayfasına Dön