qsort 快速排序完整使用指南與多類型實戰範例qsort 函數原型void qsort(void *base, size_t num, size_t width,
int (*compare)(const void *elem1, const void *elem2));
| 參數 | 說明 |
|---|---|
base | 陣列首址 |
num | 元素個數 |
width | 單個元素位元組數 |
compare | 比較函數,回傳 <0、=0、>0 表示小於、等於、大於 |
int intcmp(const void *i1, const void *i2) {
return *(int*)i1 - *(int*)i2;
}
int doublecmp(const void *d1, const void *d2) {
double tmp = *(double*)d1 - *(double*)d2;
if (fabs(tmp) < 0.000001) return 0;
return tmp > 0 ? 1 : -1;
}
注意:直接相減回傳 double 會截斷導致錯誤,必須用閾值判斷。
int stringcmp(const void *str1, const void *str2) {
return strcmp(*(char**)str1, *(char**)str2);
}
原理:char *str[] 元素型別為 char*,傳入比較函數的是元素位址 &str[i](即 char**),需解參考一次取得 char* 再比較。
#include
#include
#include
#include
// 比較函數定義同上...
int main() {
printf("--------------------- C qsort 使用方法 (預設遞增) -------------------\n");
// int 陣列
int a[] = {1,2,6,8,10,7,9,40,12,6,7};
printf("排序前: "); for(int i=0;i<11;i++) printf("%d ",a[i]);
qsort(a, 11, sizeof(int), intcmp);
printf("\n排序後: "); for(int i=0;i<11;i++) printf("%d ",a[i]);
// double 陣列
double d[] = {1.12,1.1236,1.36,1.2456,2.48,2.24123,-2.3,0};
printf("\n\n排序前: "); for(int i=0;i<8;i++) printf("%f ",d[i]);
qsort(d, 8, sizeof(double), doublecmp);
printf("\n排序後: "); for(int i=0;i<8;i++) printf("%f ",d[i]);
// 字串陣列
char *str[] = {"hello","hi","you","are","baby"};
printf("\n\n排序前: "); for(int i=0;i<5;i++) printf("%s ",str[i]);
qsort(str, 5, sizeof(char*), stringcmp);
printf("\n排序後: "); for(int i=0;i<5;i++) printf("%s ",str[i]);
return 0;
}

三種資料型別皆正確排序,驗證比較函數實現正確。