Menggunakan qsort
Pengurutan pustaka standar.
Menggunakan qsort adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.
Pengurutan dari Pustaka Standar
Pustaka standar C menyediakan qsort dalam <stdlib.h>. Fungsi ini dapat mengurutkan larik apa pun dengan fungsi pembanding, sehingga Anda jarang perlu menulis algoritme pengurutan sendiri.
Deklarasi qsort
Prototipenya adalah:
basepenunjuk ke elemen pertamanmembjumlah elemensizejumlah bita per elemencomparpenunjuk ke fungsi pembanding
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
Menulis Pembanding
Pembanding menerima dua const void *. Konversikan keduanya ke tipe sebenarnya, lakukan dereferensi, lalu kembalikan nilai negatif, nol, atau positif.
#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;
}Hindari Pengurangan dalam Pembanding
Mengembalikan x - y dapat mengalami luapan untuk bilangan bulat besar dan menghasilkan jawaban yang salah. Sebagai gantinya, gunakan idiom selisih boolean (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;
}Urutan Menurun
Untuk mengurutkan secara menurun, cukup balik hasil perbandingannya.
#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;
}Mengurutkan String
Untuk mengurutkan larik char *, pembanding menerima penunjuk ke penunjuk. Konversikan ke const char * const * lalu panggil strcmp.
#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;
}Mengurutkan Struktur
Anda dapat mengurutkan larik struktur berdasarkan bidang apa pun. Di sini, kita mengurutkan orang berdasarkan usia.
#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;
}Pengurutan Banyak Kunci
Untuk menyelesaikan nilai yang sama, bandingkan bidang kedua ketika bidang pertama sama. Dengan demikian, data diurutkan berdasarkan usia, lalu nama secara alfabetis.
#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 Tidak Stabil
Standar C tidak mewajibkan qsort bersifat stabil. Jika Anda memerlukan stabilitas, tambahkan kunci pemecah seri, seperti indeks asli, ke pembanding.
Pendamping bsearch
bsearch melakukan pencarian biner pada larik yang terurut menggunakan gaya pembanding yang sama. Gunakan bersama qsort untuk pencarian cepat.
#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;
}Mengapa Menggunakan qsort
qsort standar telah diuji dengan baik, sering kali merupakan hibrida introsort yang telah dioptimalkan, dan dapat digunakan pada tipe apa pun. Gunakan algoritme pengurutan sendiri hanya jika Anda memerlukan stabilitas atau perilaku khusus yang tidak dapat disediakan oleh pustaka.
Uji Singkat
Uji pemahaman Anda tentang qsort.
Rangkuman
Anda telah mempelajari cara menggunakan pengurutan dari pustaka standar.
qsort(base, nmemb, size, compar)mengurutkan larik apa pun- Pembanding mengonversi
const void *dan mengembalikan tanda hasil perbandingan - Hindari pengurangan; gunakan
(x > y) - (x < y) qsorttidak dijamin stabil;bsearchadalah pendamping pencariannya
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menggunakan qsort” gratis?
Ya — teks lengkap “Menggunakan qsort” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menggunakan qsort”?
Pengurutan pustaka standar. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C Academy?
Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Menggunakan qsort” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?
Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Bubble Sort dan Insertion Sort
- Quicksort
- Mergesort
- Menggunakan qsort