前些天很意外地得知學校程式設計居然是教 C語言,非工程相關應該不需要學到這種中階語言才對吧…… 好歹來個 C++ 啊 !!!!

抱怨歸抱怨,課還是得上,只好重新翻閱C的標準函式庫複習一下,結果在裡面挖到很多好用的東西呢XD 其中 stdlib.h 的 qsort 函式我覺得最驚喜,我一直以為只有 C++ 的 STL library才有 sort(),沒想到C語言也有! 不過用法有點複雜,紀錄一下。

Function Prototype

void qsort(void* base, size_t n, size_t size, int (*cmp)(const void*, const void*))

  • base 是被排序陣列的指標
  • n 是被排序陣列的大小 = sizeof(array)/sizeof(array_type)
  • size 是陣列中元素的大小 = sizeof(array_type)
  • 最後是指向比較函數的指標

指向比較函數的指標比較特別,就像 STL sort 如果要改變排序方向的話必須傳入第三個參數,自行定義的比較函數。

範例如下:

1
2
3
4
int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b )
}

傳入 a,b 兩參數型別是 void ,需要強制轉型成被排序陣列的型別,如範例中 a,b 先被強制轉型成整數指標 (int),再對他取值做處理。


完整範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
 
void printIntArr(int *arr,int arrSize) {
for(int i=0; i<arrSize; i++) {
       printf("%d ",arr[i]);
   } 
   printf("\n");
}
 
int cmpfunc (const void * a, const void * b) {
    return *(int*)a - *(int*)b;
}
 
int main ()
{
int arr[] = { 56, 45, 48, 12, 4, 3, 4568, 45, 48, 213, 54, 32, 4, 8, 9, 6, 4, 23, 0, -2, 56 };
 
printIntArr(arr,(sizeof(arr)/sizeof(int)));
 
qsort(arr,sizeof(arr)/sizeof(int),sizeof(int),cmpfunc); //Quick sort
 
printIntArr(arr,(sizeof(arr)/sizeof(int)));
 
return 0;
}

輸出結果:
Output