首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 標準庫 qsort 快速排序完整使用指南與多類型實戰範例

     編輯:關於C

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;
}

執行結果

qsort 執行結果

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved