【C】排序算法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);
--------------------- 
作者:zhao888789 
來源:CSDN 
原文:https://blog.csdn.net/zhao888789/article/details/79186619 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章