試想一下,如果讓你自己設(shè)計qsort函數(shù),需要些什么東西,首地址要有吧,總共有幾個元素要有吧,每個元素占多大的內(nèi)存要有吧(想想就知道函數(shù)內(nèi)部要根據(jù)內(nèi)存塊的大小交換數(shù)據(jù)實現(xiàn)排序),最后一個規(guī)則總要有吧,qsort的靈活性在于規(guī)則是活的不是死的,其實大多數(shù)語言的排序都是類似的機制啦。。。看下qsort的原型
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、海拉爾網(wǎng)站維護、網(wǎng)站推廣。
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
base就是所謂的首地址,nelem就是元素個數(shù),width,就是每個元素的大小,fcmp是一個函數(shù)指針,這里函數(shù)的定義要類似于int cmp(const void*a,const void*b),其實很多人不知道怎么使用qsort主要是在于對這個函數(shù)不懂得如何寫,其實想想就知道函數(shù)把每個元素的地址扔給比較函數(shù),根據(jù)比較函數(shù)的返回值來決定到底是a在前面還是b在前面,所以在函數(shù)里面要先取出值,所以一般的寫法就是
int cmp(const void*a,const void*b)
{
return *(T*)a-*(T*)b;
}
先強制轉(zhuǎn)換成T類型再用取值符號*取出指,函數(shù)之所以用空指針是因為空指針可以指向任何類型,對于基本類型,只要將T修改為基本類型就行了,對于結(jié)構(gòu)體之類的的指針,則return ((T*)a)-x-((T*)b)-x;其中T就是結(jié)構(gòu)體的名稱,x就是你要比較的字段,當然如果你要降序的話就將ab顛倒就行了,說了這么多,寫一個例子,比如要對下面的數(shù)組排序
int a[5]={2,10,5,4,0};
qsort(a,5,sizeof(int),cmp);
比較函數(shù)
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
。。呵呵,啰嗦了點。希望對你有幫助
#includestdio.h
#includestdlib.h
#define N 100
int cmp(const void*a,const void*b)
{//快速排序比較函數(shù)
int *x=(int*)a;
int *y=(int*)b;
return *y-*x;
}
int main()
{
int a[N]={9,7,5,3,1};
int b[N]={8,6,4,2,0};
int sum[2*N]={0};//合并數(shù)組
int k=0;//合并數(shù)組元素個數(shù)的計數(shù)
for(int i=0;i5;i++)
{
sum[k++]=a[i];//a數(shù)組元素賦值給sum數(shù)組
}
for(int i=0;i5;i++)
{
sum[k++]=b[i];//b數(shù)組元素賦值給sum數(shù)組
}
qsort(sum,10,sizeof(sum[0]),cmp);//降序排序
for(int i=0;ik;i++)//輸出
printf("%d ",sum[i]);
return 0;
}
qsort是編譯器函數(shù)庫自帶的快速排序函數(shù)。其原型為:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
參數(shù)含義如下:
base: 待排序數(shù)組首地址。
num: 數(shù)組中待排序元素數(shù)量。
width: 各元素的占用空間大小。
compare: 指向函數(shù)的指針,用于確定排序的順序。
比較難以理解的是compare函數(shù)指針,其確定了如何去排序,通過修改該函數(shù)指針指向的函數(shù)體,可以對復雜類型進行排序,如結(jié)構(gòu)體等。 也可以改變排序方式,如升序或降序。
要達到問題中的效果,需要在第一個參數(shù)傳入數(shù)據(jù)所在行的首地址,第二個參數(shù)傳入一行中元素的個數(shù),第三行傳入每個元素占用的空間,第四個傳入自定義的比較函數(shù)指針(函數(shù)名)。
下面就以一個3行4列整型數(shù)組a[3][4],對其第二行(a[1])進行升序排序為例,寫一個代碼,輔助理解。
#include?stdio.h
#include?stdlib.h
int?cmp(const?void?*a,?const?void?*b)
{
return?*((int?*)a)??*((int?*)b);//由于是整型數(shù)組,所以將指針轉(zhuǎn)為整型指針后取值,再比較。
}
int?main()
{
int?a[3][4]?=?
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};//定義的原始數(shù)組,可以看到是亂序的。
int?i,j;
qsort(a[1],?4,?sizeof(int),?cmp);
//以下代碼輸出數(shù)組元素值,以驗證排序結(jié)果。
for(i?=?0;?i??3;?i?++)
{
for(j?=?0;?j??4;?j?++)
printf("%3d",a[i][j]);
printf("\n");
}
return?0;
}
程序運行后輸出:
5??1?54??6
12?22?32?44
34??5??2??1
可以看到第二行已經(jīng)升序排列,而其它兩個沒有變化。
qsort函數(shù)是編譯器函數(shù)庫自帶的快速排序函數(shù)。
qsort 的函數(shù)原型是:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
它的參數(shù)為: 1 待排序數(shù)組首地址
2 數(shù)組中待排序元素數(shù)量
3 各元素的占用空間大小
4 指向函數(shù)的指針,用于確定排序的順序
它在使用的時候需要包含頭文件:stdlib.h
實例:
#includestdio.h
#includestdlib.h
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int *array;
int n;
scanf("%d",n);
array=(int*)malloc(n*sizeof(int));
int i=0;
for(;in;i++)
{
scanf("%d",(array+i));
}
qsort(array,n,sizeof(int),comp);
for(i=0;in;i++)
{
printf("%d\t",array[i]);
}
return0;
}
文章名稱:關(guān)于c語言qsort函數(shù)降序的信息
當前路徑:http://chinadenli.net/article38/dodcgpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、標簽優(yōu)化、電子商務(wù)、Google、移動網(wǎng)站建設(shè)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)