C语言标准库函数qsort具体解释
1?函數簡單介紹
功 能: 使用高速排序例程進行排序
頭文件:stdlib.h用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的占用空間大小
4 指向函數的指針,用于確定排序的順序
2?基本使用方法
使用qsort()排序并用 bsearch()搜索是一個比較經常使用的組合,使用方便快捷。
qsort 的函數原型是void __cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))
當中base是排序的一個集合數組,num是這個數組元素的個數,width是一個元素的大小,comp是一個比較函數。
比方:對一個長為1000的數組進行排序時,int a[1000]; 那么base應為a,num應為 1000,width應為 sizeof(int),comp函數隨自己的命名。
qsort(a,1000,sizeof(int),comp);
當中comp函數應寫為:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}qsort上面是由小到大排序,return *(int *)b-*(int *)a; 為由大到小排序。
是對一個二維數組的進行排序:
int a[1000][2]; 當中依照a[0]的大小進行一個總體的排序,當中a[1]必須和a[0]一起移動交換。
qsort(a,1000,sizeof(int)*2,comp);
int comp(const void *a,const void *b)
{
return ((int *)a)[0]-((int *)b)[0];
}
qsort函數是ANSI C標準中提供的,其聲明在stdlib.h文件里,是依據二分發寫的,其時間復雜度為n*log(n),其結構為:
void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));
當中:
*base 為要排序的數組
nelem 為要排序的數組的長度
width 為數組元素的大小(一字節為單位)
默認是從小到大排序的!
(* Comp)(const void *p1,const void *p2) 為推斷大小函數的指針,這個函數須要自定義,假設p1>p2,函數返回-1;a<b,函數返回1;a==b函數返回0
排序方法有非常多種:選擇排序,冒泡排序,歸并排序,高速排序等。
看名字都知道高速排序 是眼下公認的一種比較好的排序算法(我沒聽說速度比這快的了,特殊場合例外),比選擇排序,冒泡排序都要快。這是由于他速度非???#xff0c;所以系統也在庫里實現這個算法,便于我們的使用。
這就是qsort。
qsort 要求提供一個比較函數,是為了做到通用性更好一點。比方你不只的是要排序一個數字而已,可能你要用來排序幾個數字 ,比方有一個結構
struct num
{
int a;
int b;
};
然后我有一個num 類型的數組, num dddd[100];
我想給 dddd這個數組排序,那怎么辦? 我想讓 a +b 最大的num元素排在數組的最前面,那又怎么辦?
這都能夠通過定義比較函數來做到的。
比較函數的作用就是給qsort指明元素的大小是怎么比較的。
像這種比較函數 inline int MyCmp(const void* a, const void* b)?
都是有兩個元素作為參數,返回一個int值, 假設比較函數返回大于0,qsort就覺得 a>b , 假設比較函數返回等于0 qsort就覺得a 和b 這兩個元素相等,返回小于零 qsort就覺得 a<b 。
qsort 知道元素大小,就能夠把大的放到前面去。
假設你的比較函數放回本來應該是1 的(a>b),你比較函數卻返回一個 -1 (小于零的)那么qsort覺得a<b 的,就把 b放到前面去,但實際上是a大于b的,所以就造成升降序的區別了。
3?相關舉例
七種qsort排序方法?
<本文中排序都是採用的從小到大排序>?
一、對int類型數組排序?
int num[100];?
Sample:?
int cmp ( const void *a , const void *b )?
{?
return *(int *)a - *(int *)b; //強制轉換類型
}?
qsort(num,100,sizeof(num[0]),cmp);?
二、對char類型數組排序(同int類型)?
char word[100];?
Sample:?
int cmp( const void *a , const void *b )?
{?
return *(char *)a - *(char *)b;?
}?
qsort(word,100,sizeof(word[0]),cmp);?
三、對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);?
四、對結構體一級排序?
struct In?
{?
double data;?
int other;?
}s[100];
//依照data的值從小到大將結構體排序,關于結構體內的排序重要數據data的類型能夠非常多種,參考上面的樣例寫?
int cmp( const void *a ,const void *b)?
{?
return (*(In *)a).data > (*(In *)b).data ? 1 : -1;?
}?
qsort(s,100,sizeof(s[0]),cmp);?
五、對結構體二級排序?
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);?
六、對字符串進行排序?
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);?
七、計算幾何中求凸包的cmp?
int cmp(const void *a,const void *b) //重點cmp函數,把除了1點外的全部點,旋轉角度排序?
{?
struct point *c=(point *)a;?
struct point *d=(point *)b;?
if( calc(*c,*d,p[1]) < 0) return 1;?
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //假設在一條直線上,則把遠的放在前面?
return 1;?
else return -1;?
}?
PS:?
當中的qsort函數包括在<stdlib.h>的頭文件中,strcmp包括在<string.h>的頭文件中
轉載于:https://www.cnblogs.com/hrhguanli/p/4500504.html
總結
以上是生活随笔為你收集整理的C语言标准库函数qsort具体解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Form -----内容
- 下一篇: [Objective-c 基础 - 2.