VC庫中快排函式的詳解

2021-09-06 05:41:53 字數 2644 閱讀 6589

author: bakari  date:  2012.8.9

以前都是自己手動寫這個演算法,覺得也不是一件很麻煩的事,但現在寫的程式基本上都用得著快排,重新去寫這個演算法很沒有必要。直接使用vc庫中提供的qsort方便了很多,並且百試不爽。今天總結一下這個函式的強大之處。

經典排序之快速排序:

1、函式原型:

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

第乙個是陣列位址,第二是陣列大小,第三個是陣列中每個元素的位元組數,最後乙個是個比較函式的函式指標,表示以一種什麼樣的方式比較陣列的大小。(當然這個不一定是陣列啊,可以是任意資料型別,我用陣列是方便描述)

一般典型的用法是像這樣(反正我是這樣用):qsort(s,n,sizeof(s[0]),cmp);       //這裡用sizeof(s[0])有乙個好處,下面會講。

所在的標頭檔案:#include

2、拆解引數:

先看這個比較函式:

函式原型:int cmp(const void *a,const void *b);

返回型別為 int,引數用const void * 就是快排的強大之處之一,表明可以為任何資料型別進行排序,只要進行強制型別轉換即可。

第三個引數表示元素的大小 ,寫sizeof([0])的好處是在遇到對結構體排序時,寫成n * sizeof( int )這樣會出問題,寫成sizeof([0])方便保險,而且想對陣列中任意其他元素進行排序時,只需稍作修改即可,如:qsort(&s[i], n, sizeof(s[i]) , cmp);

3、舉例說明:

例項1:最常見的,對 int 陣列排序

1 #include 2

3int cmp(const

void *a, const

void *b)47

8int

main()

9

例項2:對double型陣列排序,原理同int注意:由於兩個double型的資料不可能相等,只能通過fabs(a-b)<1e-20之類的來判斷,所以此處通過返回 1 和 - 1來判斷

現在只顯示比較函式,測試和上面一致。(下同)

1

int cmp(const

void * a, const

void *b)

2

例項3:對字元陣列排序,原理同int

1

int cmp(const

void *a,const

void *b)

2

例項4:對結構體排序(兩個資料,乙個相等在比較另乙個)

1

int cmp(const

void *a,const

void *b)

2

例項5:對字串陣列排序(char s)

1

int cmp(const

void *a,const

void *b)

2

例項6:對指標陣列排序(char *s)

1

char *s[100];2

3int cmp(const

void *a,const

void *b)47

8int

main()917

18 qsort(s,n,sizeof(s[0

]),cmp);

1920

for(int i = 0; i < n; i++) printf("

%s\n

",s[i]);

2122

return0;

23 }

例項7:按指定方式排序(這個是我一直沒遇到的,乙個網友寫的,不過和其他的大同小異)

如對只有大小寫字母的字串"aajkukdyubcdwyz"進行排序,要求大寫字母在前,小寫字母在後

下面是乙個網友寫的**,個人感覺很好。

1

int cmp(const

void *a, const

void *b)214

15int

main()

16

4、說明:快排是不穩定的,這個不穩定表現在兩個方面:

一方面是時間的不確定,最好情況o(n) ,最壞情況o(n^2);而我們常說的o(nlog(n))是平均時間,不過即使這樣,使用快排還是既方便又快捷的。

另一方面是元素的順序在排序前後可能會不一樣,比如:2 3 4 3 我用 2 3a 4 3b 表示,排序後可能變成 2 3b 4 3a,因為在排序過程中會涉及到乙個元素交換多次的情況。

VC庫中快排函式的詳解

author bakari date 2012.8.9 以前都是自己手動寫這個演算法,覺得也不是一件很麻煩的事,但現在寫的程式基本上都用得著快排,重新去寫這個演算法很沒有必要。直接使用vc庫中提供的qsort方便了很多,並且百試不爽。今天總結一下這個函式的強大之處。經典排序之快速排序 1 函式原型 ...

STL庫中快排sort函式詳解

使用 include using namespace std 作用 排序 時間複雜度 n lg n 實現原理 sort並不是簡單的快速排序,它對普通的快速排序進行了優化,此外,它還結合了插入排序和推排序。系統會根據你的資料形式和資料量自動選擇合適的排序方法,這並不是說它每次排序只選擇一種方法,它是在...

STl庫中的快排

acm做題過程中經常要用到排序,一般都選用快排,在此對快排做個總結 其中 用c表示 include include 必須包含該標頭檔案 struct 結構體型別名 資料型別 struct 空格 結構體型別名 陣列名 陣列大小 int 自定義函式名字 const void a,const void b...