【C語言】qsort使用詳解

qsort函數是C語言的屬於<stdlib.h>頭文件的快速排序函數,qsort(array,array+n,cmp);數組

關於cmp函數的定義規則咱們只需簡單的記得,當cmp的返回值爲true時,即表示cmp函數的第一個參數將會排在第二個參數以前(即在咱們定義的規則中,cmp表示第一個參數是否比第二個參數大,如果,則排在前面)。函數

下面經過幾個例子來講明:ui

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare );
int compare (const void *elem1, const void *elem2 ) );
spa

qsort(quicksort)主要根據你給的比較條件給一個快速排序,主要是經過指針移動實現排序功能。排序以後的結果仍然放在原來數組中。.net

參數意義以下:base:須要排序的目標數組開始地址;num:目標數組元素個數;width:目標數組中每個元素長度;compare:函數指針,指向比較函數

1.對int類型數組排序
int num[100];
int cmp ( const void *a , const void *b )
{
  return *(int *)a - *(int *)b;
}
可見:參數列表是兩個空指針,如今他要去指向你的數組元素。因此轉型爲你當前的類型,而後取值。升序排列。
由於是按照acs碼的值進行的,因此在前面的字符的值必定小於後面的字符。
那麼,對於a b,若是a的值>b的值,就說明在字母表中a在b的後面,返回值爲1表示ture,執行交換。3d

qsort(num,100,sizeof(num[0]),cmp);

指針

2.對char類型數組排序(同int類型)
char word[100];
int cmp( const void *a , const void *b )
{
  return *(char *)a - *(char *)b;
}blog

qsort(word,100,sizeof(word[0]),cmp);排序

 

3.對double類型數組排序(特別要注意)
double in[100];
int cmp( const void *a , const void *b )
{
  return *(double *)a > *(double *)b ? 1 : -1;
}
字符串

返回值的問題,顯然cmp返回的是一個整型,因此避免double返回小數而被丟失。

qsort(in,100,sizeof(in[0]),cmp);

 

4.對struct一級排序

struct In
{
double data;
int index;
}s[100]


//按照data的值從小到大將結構體排序,關於結構體內的排序關鍵數據data的類型能夠不少種,參考上面的例子寫

int cmp( const void *a ,const void *b)
{
  return (*(In *)a).data > (*(In *)b).data ? 1 : -1;
  //注意,這條語句在VC6.0環境下運行可能會出錯,可是並非語句錯了,而是你要先 Build ,或者所有重建。總之語句是對的。
  /*
  或者你能夠將這上面1條語句改爲下面這3條語句
  struct In *aa = (In *)a;
  struct In *bb = (In *)b;
  return aa->data > bb->data ? 1 : -1;
  */
}
qsort(s,100,sizeof(s[0]),cmp);

 

ps:定義的結構體若是是指針,訪問成員時就用->;若是定義的是結構體變量,訪問成員就用.

 

5.對struct二級排序
struct In
{
  int x;
  int y;
}s[100];


//按照x從小到大排序,當x相等時按照y從大到小排序
 
int cmp( const void *a , const void *b )
{
  struct In *c = (In *)a;
  struct In *d = (In *)b;
  if(c->x != d->x) return c->x - d->x;
    else return d->y - c->y;
}


qsort(s,100,sizeof(s[0]),cmp);


6.對string進行排序
char str[100][100];
int cmp(const void* a,const void* b )
{
  return strcmp((char *)a,(char*)b);
}
qsort(str,n,sizeof(str[0]),cmp);
值得注意的是,上面的n,頗有可能會被誤認爲是100,這裏實際應該是你要排序的個數,好比說你實際上只有str[0],str[1],str[2]這三個字符串要排序,那麼n就應該是3,而不是100;
 
struct In
{
  int data;
  char str[100];
}s[100];
//按照結構體中字符串str的字典順序排序
int cmp ( const void *a , const void *b )
{
  return strcmp( (*(In *)a)->str , (*(In *)b)->str );
}

qsort(s,100,sizeof(s[0]),cmp);

 

(參考自:http://blog.csdn.net/yzl_rex/article/details/7874513

     http://blog.csdn.net/u014767460/article/details/24099743)

 

 補充:

由於cmp函數要求

實際上,不使用 const void *  在VC裏能夠編譯經過:

可是在dev C++裏卻不能,此時要使用強制類型轉換來實現:

 

相關文章
相關標籤/搜索