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

C語言回調函數實作泛型冒泡排序:支援任意型別 (int/string/struct)

     編輯:關於C

核心設計: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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved