先說明一下: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函數
對二維數組的排序: