天天看點

qsort函數、sort函數【轉】

先說明一下:qsort和sort,隻能對連續記憶體的資料進行排序,像連結清單這樣的結構是無法排序的。

首先說一下, qsort

qsort(基本快速排序的方法,每次把數組分成兩部分和中間的一個劃分值,而對于有多個重複值的數組來說,基本快速排序的效率較低,且不穩定)。內建在c語言庫函數裡面的的qsort函數,使用 三 路劃分的方法解決排序這個問題。所謂三路劃分,是指把數組劃分成小于劃分值,等于劃分值和大于劃分值的三個部分。

具體介紹:-^^

 void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )

 int compare (const void *elem1, const void *elem2 ) );

 qsort(即,quicksort)主要根據你給的比較條件給一個快速排序,主要是通過指針移動實作排序功能。排序之後的結果仍然放在原來數組中。

 參數意義如下:

 第一個參數 base 是 需要排序的目标數組名(或者也可以了解成開始排序的位址,因為可以寫&s[i]這樣的表達式)

 第二個參數 num 是 參與排序的目标數組元素個數

 第三個參數 width 是單個元素的大小(或者目标數組中每一個元素長度),推薦使用sizeof(s[0])這樣的表達式

 第四個參數 compare 就是讓很多人覺得非常困惑的比較函數啦。

我們來簡單讨論compare這個比較函數(寫成compare是我的個人喜好,你可以随便寫成什麼,比如 cmp 什麼的,在後面我會一直用cmp做解釋)。

典型的compare的定義是int compare(const void *a,const void *b);

傳回值必須是int,兩個參數的類型必須都是const void *,那個a,b是随便寫的,個人喜好。假設是對int排序的話,如果是升序,那麼就是如果a比b大傳回一個正值,小則負值,相等傳回0,其他的依次類推,後面有例子來說明對不同的類型如何進行排序。

qsort 的使用方法:

 一、對int類型數組排序

調用樣式:

 示例完整函數(已在 vc6.0上運作通過):

二、對char類型數組排序(同int類型)

調用格式:

//附,可能 getchar();  會派上用場 

 三、對double類型數組排序(特别要注意)

 調用格式:

qsort(in,100,sizeof(in[0]),cmp);

  //附:排序結果的輸出,一般建議用 “ %g ” 格式

 /* 在這裡多嘴一句,"%g"格式輸出 雖然書上是說系統會自動選擇 " %f " 格式  和 " %e " 格式 中長度較短的格式,并去掉無意義的0,但實際上系統如果選擇了" %e ",系統會輸出比 “ %e " 格式更省一位的格式輸出。(此結論,來自vc6.0的實際操作)*/

 四、對結構體一級排序

qsort(s,100,sizeof(s[0]),cmp);

 五、對結構體二級排序

六、對字元串進行排序

 qsort(s,100,sizeof(s[0]),cmp);

 注意!qsort 中的  cmp 得自己寫 。

再說說   sort (常用于  c++ )

sort 使用時得注明:using namespace std;   或直接打 std::sort()  還得加上  #include <algorithm> 頭檔案

 例:

std::sort是一個改進版的qsort. std::sort函數優于qsort的一些特點:對大數組采取9項取樣,更完全的三路劃分算法,更細緻的對不同數組大小采用不同方法排序。

最後,我們來說說sort、qsort的差別:

sort是qsort的更新版,如果能用sort盡量用sort,使用也比較簡單,不像qsort還得自己去寫 cmp 函數,隻要注明  使用的庫函數就可以使用,參數隻有兩個(如果是普通用法)頭指針和尾指針;

 預設sort排序後是升序,如果想讓他降序排列,可以使用自己編的cmp函數

對二維數組的排序: