核心設計:void* + 比較函數指針 + 交換函數
// 比較函數原型:回傳 >0 (a>b), =0 (a==b), <0 (a 0) swap(p1, p2, size);
}
}
}
型別專用比較函數
// int 比較
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 但安全
}
// 字串比較 (char* 陣列,元素是指針)
int cmp_str(const void *a, const void *b) {
const char *sa = *(const char **)a;
const char *sb = *(const char **)b;
return strcmp(sa, sb);
}
// 結構體比較 (依年齡)
typedef struct { char name[20]; int age; } Person;
int cmp_person_age(const void *a, const void *b) {
return ((const Person *)a)->age - ((const Person *)b)->age;
}
使用範例
int main() {
// 排序 int 陣列
int nums[] = {5,2,8,1,9};
bubble_sort(nums, 5, sizeof(int), cmp_int);
// 排序字串陣列
char *strs[] = {"delta","alpha","epsilon","beta","gamma"};
bubble_sort(strs, 5, sizeof(char *), cmp_str);
// 排序結構體陣列
Person people[] = {{"Alice",30},{"Bob",25},{"Carol",35}};
bubble_sort(people, 3, sizeof(Person), cmp_person_age);
return 0;
}
關鍵點總結
void* 抹除型別,size 記錄元素大小,cmp 注入比較邏輯 → **泛型程式設計**雛形。
swap 逐 byte 複製,支援任意型別 (含結構體),但非最佳效能 (大物件建議交換指針)。
- 標準庫
qsort 同樣原理,但採用快速排序 (平均 O(n log n)),生產環境請用 qsort。