1. 程式人生 > >C語言qsort函式用法

C語言qsort函式用法

qsort函式簡介

  排序方法有很多種:選擇排序,氣泡排序,歸併排序,快速排序等。 看名字都知道快速排序是目前公認的一種比較好的排序演算法。因為他速度很快,所以系統也在庫裡實現這個演算法,便於我們的使用。 這就是qsort函式(全稱quicksort)它是ANSI C標準中提供的,其宣告在stdlib.h檔案中,是根據二分法寫的,其時間複雜度為n*log(n)

  功能: 使用快速排序例程進行排序
  標頭檔案stdlib.h
  用法:  void qsort(voidbase,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); 
複製程式碼