C語言qsort函數用法


 

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://wenku.baidu.com/link?url=9dEkcBiIyzIhRtpzqLd0W_sq-oQA6jiJRSlsWH7P8WmAsvsZdw3rPFAxoOOaR_qihT6ozJ9FDL0gUnUyzW2wFD-eAjvcCBp7vMH37hT8OHK

     http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html

     http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/22/2513776.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM