1. 程式人生 > >C語言排序函式qsort( )

C語言排序函式qsort( )

關於c語言排序的問題,以前我都是用氣泡排序或者快速排序,知道這幾天,在杭電上面打ACM的時候,才發現又一種排序的函式,就是qsort();

qsort()括號裡面有4個引數
第一個引數是將要排序的陣列名array;
第二個引數是將要排序的數量n;
第三個引數是每個要排序的引數的大小xizeof(array[o]);
第四個引數是自己寫的一個比較函式cmp;

前三個引數還是比較好搞的,但是最後一個引數就比較麻煩了。
一開始見到的題目就是讓我排序一個int型別的陣列,
那cmp就應該這樣寫

int cmp(const void*a,const void*b)
{
    return
*(int*)a - *(int*)b; }

宣告cmp的括號裡面只能將引數寫成const void*;
return部分的話,因為我們比較的是int型別的陣列,所以要強制轉換格式成為指向int的指標,然後再解引用;
然後a-b就是升序排列,b-a的話就是降序排列;

然後到後面的一題,就需要讓我去排一個結構體

typedef struct{
    int a;
    int b;
}node;

node arrays[1007];

我們要按照a的降序排列這個結構體陣列
在qsort()的引數方面有兩點需要注意
① 第三個引數要寫成sizeof(node);
因為排序的最小單位就是一個結構
② cmp的宣告

int cmp(const void*x, const void*y)
{
    return ((*(node*)y).a) - ((*(node*))x).a);
}

因為我們排的是結構,所以要讓引數強制轉化格式為指向結構的指標,然後解引用做差;

當然之前我在別的部落格上面看到說這個強制轉化要在return前完成,但是我真的去寫的時候,我的code::blocks總是給我報錯,在我想砸電腦的時候,我試了一下參照排列int型別陣列那樣寫cmp
把int換成結構體,結果居然就不報錯了,而且完美AC了!!!

ACM題目:1052(排int型別陣列);3177(排結構);
from HDU OJ;