void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
base:數組首地址nmemb:元素個數size:單元素大小 sizeof(T)compar:比較函數,返回 < 0 / = 0 / > 0 表示 < / = / >int cmp_int(const void *a, const void *b) {
int ia = *(const int*)a;
int ib = *(const int*)b;
return (ia > ib) - (ia < ib); // 避免溢出,不直接用 ia - ib
}
int arr[] = {5, 2, 9, 1, 7};
qsort(arr, 5, sizeof(int), cmp_int);
int cmp_char(const void *a, const void *b) {
return *(const char*)a - *(const char*)b;
}
typedef struct { int data; } Node;
int cmp_node_data(const void *a, const void *b) {
const Node *pa = (const Node*)a;
const Node *pb = (const Node*)b;
return (pa->data > pb->data) - (pa->data < pb->data);
}
Node nodes[] = {{5}, {2}, {9}, {1}, {7}};
qsort(nodes, 5, sizeof(Node), cmp_node_data);
typedef struct { int x, y; } Point;
int cmp_point(const void *a, const void *b) {
const Point *pa = (const Point*)a;
const Point *pb = (const Point*)b;
if (pa->x != pb->x) return (pa->x > pb->x) - (pa->x < pb->x);
return (pa->y > pb->y) - (pa->y < pb->y);
}
typedef struct { char name[32]; } Person;
int cmp_person_name(const void *a, const void *b) {
const Person *pa = (const Person*)a;
const Person *pb = (const Person*)b;
return strcmp(pa->name, pb->name);
}
int *ptrs[5];
for (int i = 0; i < 5; i++) ptrs[i] = &arr[i];
int cmp_ptr(const void *a, const void *b) {
int *pa = *(int**)a;
int *pb = *(int**)b;
return (*pa > *pb) - (*pa < *pb);
}
qsort(ptrs, 5, sizeof(int*), cmp_ptr);
return ia - ib 可能溢出,改用 (ia > ib) - (ia < ib) 或 ia < ib ? -1 : ia > ib。const void*,轉換時保留 const。NaN 不等於自身,需特殊處理;+0.0 == -0.0 為真。qsort 是 C 標準庫提供的通用排序,核心在於正確編寫比較函數。掌握基本類型、結構體單/多字段、字符串、指針數組等常見場景的比較函數寫法,即可應對 95% 的排序需求。