排序方法有很多種:選擇排序,冒泡排序,歸併排序,快速排序等。 看名字都知道快速排序是目前公認的一種比較好的排序算法。因爲他速度很快,所以系統也在庫裏實現這個算法,便於我們的使用。 這就是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);
---------------------
作者:zhao888789
來源:CSDN
原文:https://blog.csdn.net/zhao888789/article/details/79186619
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!