qsort函數簡介
排序方法有很多種:選擇排序,冒泡排序,歸並排序,快速排序等。 看名字都知道快速排序是目前公認的一種比較好的排序算法。因為他速度很快,所以系統也在庫里實現這個算法,便於我們的使用。 這就是qsort函數(全稱quicksort)。它是ANSI C標准中提供的,其聲明在stdlib.h文件中,是根據二分法寫的,其時間復雜度為n*log(n)
功能: 使用快速排序例程進行排序
頭文件:stdlib.h
用法: void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
參數: 1 待排序數組,排序之后的結果仍放在這個數組中
2 數組中待排序元素數量
3 各元素的占用空間大小(單位為字節)
4 指向函數的指針,用於確定排序的順序(需要用戶自定義一個比較函數)
qsort要求提供一個自己定義的比較函數。比較函數使得qsort通用性更好,有了比較函數qsort可以實現對數組、字符串、結構體等結構進行升序或降序排序。
如比較函數 int cmp(const void *a, const void *b) 中有兩個元素作為參數(參數的格式不能變),返回一個int值,比較函數cmp的作用就是給qsort指明元素的大小是怎么比較的。
qsort中幾種常見的比較函數cmp
一、對int型數組排序
int num[100]; int cmp_int(const void* _a , const void* _b) //參數格式固定 { int* a = (int*)_a; //強制類型轉換 int* b = (int*)_b; return *a - *b; } qsort(num,100,sizeof(num[0]),cmp_int);
可見,參數列表是兩個空指針,現在他要去指向你的數組元素。所以轉換為你當前的類型,然后取值。默認升序排列(從小到大),如果想降序排列返回*b-*a即可。
二、對char型數組排序(同int類型)
char word[100]; int cmp_char(const void* _a , const void* _b) //參數格式固定 { char* a = (char*)_a; //強制類型轉換 char* b = (char*)_b; return *a - *b; } qsort(word,100,sizeof(word[0]),cmp_char);
三、對double型數組排序
double in[100]; int cmp_double(const void* _a , const void* _b) //參數格式固定 { double* a = (double*)_a; //強制類型轉換 double* b = (double*)_b; return *a > *b ? 1 : -1; //特別注意 } qsort(in,100,sizeof(in[0]),cmp_double);
在對浮點或者double型的一定要用三目運算符,因為要是使用像整型那樣相減的話,如果是兩個很接近的數則可能返回一個很小的小數(大於-1,小於1),而cmp的返回值是int型,因此會將這個小數返回0,系統認為是相等,失去了本來存在的大小關系
四、對字符串進行排序
char word[100][10]; int cmp_string(const void* _a , const void* _b) //參數格式固定 { char* a = (char*)_a; //強制類型轉換 char* b = (char*)_b; return strcmp(a,b); } qsort(word,100,sizeof(word[0]),cmp_string);
http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html
http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/22/2513776.html