今天再做作業時需要用到排序,百度了下qsort函數,學習了。
codeqsort()
一、 簡介
qsort()包含在ANSI C庫中,qsort()根據給定的比較條件、通過指針移動實現快速排序,排序之後的結果仍然放在原數組中。使用qsort函數必須自己寫一個比較函數。 C++ STL中有sort()函數,可視為qsort()的改進版本。我們知道,在面對比較大的數組時,經過一定次數的快速排序迭代以後,數組經基本有序,所以在運行插入排序的時候,只需要很少數量的比較和交換就可以完成排序。sort()函數利用這一性質進行了算法優化,會根據數據量大小選擇合適的排序算法,基本解決了qsort()在某些情況下會產生退化的問題。
二、 使用說明
qsort()包含在stdlib.h頭文件中,其函數原型如下:
void qsort ( void * base, size_t num, size_t size, int ( *
comparator ) ( const void *, const void * ) )
參數說明:
base
-
數組起始地址
num
-
數組元素個數
size
-
每一個元素的大小
comparator
-
函數指針,指向比較函數
Return Value
-
無返回值
對於
comparison
函數,有一下兩點說明:
1) 該函數有兩個形參,兩個形參均指向將用於比較的兩個元素,這兩個形參被強制轉換為void*. 在這個函數中,這兩個形參將被重新類型轉換為元素本身的類型,並且進行比較。
2) 返回值為一個負值、0、正值,分別代表第一個元素與第二個元素的大小關系:小於,等於,大於。
1. 對int/char類型數組排序
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
2. 對double類型數組排序
double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);
3. 對結構體一級排序
struct Sample
{
double data;
int other;
}s[100]
//按照data的值從小到大將結構體排序
int cmp( const void *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
4. 對結構體二級排序
struct Sample
{
int x;
int y;
}s[100];
//按照x從小到大排序,當x相等時按照y從大到小排序
int cmp( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
5. 對字符串進行排序(字典序)
struct Sample
{
int data;
char str[100];
}s[100];
//按照結構體中字符串str的字典順序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
Tips:要准備記住compare函數的寫法可能比較難,其實也可以寫成C++的版本:
bool cmp2(const int& x, const int& y)
{
return x < y;
}