功 能: 使用快速排序例程進(jìn)行排序
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的舞陽網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數(shù):1 待排序數(shù)組首地址 2 數(shù)組中待排序元素?cái)?shù)量 3 各元素的占用空間大小 4 指向函數(shù)的指針,用于確定排序的順序
其實(shí)c中的函數(shù)不用死記,知道有這個(gè)函數(shù)及其功能就可以了,然后有用的時(shí)候,具體參數(shù)查一下就可以了。
希望能幫到你
1.該函數(shù)屬于#include stdlib.h標(biāo)準(zhǔn)庫中, 且是快速排序;
2.qsort函數(shù)聲明:void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
3.*base:指向要排序數(shù)組的第一個(gè)元素指針,而數(shù)組名則是該數(shù)組的起始地址;size_t nitems:指數(shù)組中元素個(gè)數(shù);size_t size:指數(shù)組中單個(gè)元素的大小;cmp:指用來比較兩個(gè)元素的函數(shù)(一般根據(jù)需求自己重寫);
4.實(shí)例:1.定義一結(jié)構(gòu)體:
???struct Interval{
? ? ? ? ? ? ? ? int x, y;
? ? ? ? ? ? ? }I[110];
? ? ? ? ? ? 2.重寫qsort函數(shù)
???int cmp(const void *a, const void *b){
if(((const struct Interval *)a)-x != ((const struct Interval *)b)-x)
? ????????????????????????????? return ((const struct Interval *)b)-x ((const struct Interval *)a)-x; //先按左端點(diǎn)從大到小排列
? ? ? ? ? ? ? ? ? ? ? ? ?else return ((const struct Interval *)a)-y ((const struct Interval *)b)-y; //然后按左端點(diǎn)相同的右端點(diǎn)從小到大排序
}
? ? ? ? ? ? ? ? ? ? 1.((const struct Interval *)b)是指針類型? ? 2.return的值與需求相反(具體可看上文)
? ? ? ? ? ? ? ?3.main函數(shù)里調(diào)用:
???qsort(I, n, sizeof(struct Interval), cmp); (結(jié)構(gòu)體的單個(gè)元素大小與其他標(biāo)準(zhǔn)類型不同)。
建議你這樣試試看:
先定義數(shù)組大?。?/p>
然后定義一個(gè)數(shù)組比較函數(shù):
注意事項(xiàng):
更安全的調(diào)用方式為qsort_s;
然后調(diào)用 qsort函數(shù)進(jìn)行排序,具體邏輯如下:
代碼合并如下:
這里只是根據(jù)你的數(shù)據(jù)生成了二維數(shù)組,可以根據(jù)你的具體情況進(jìn)行調(diào)整;另外,關(guān)于qsort函數(shù)的用法,參考:qsort
關(guān)于比較函數(shù)的返回值,這里有一個(gè)表:
最后,以上代碼的運(yùn)行結(jié)果如下:
引自 qsort,包含在stdlib.h頭文件里,函數(shù)一共四個(gè)參數(shù),沒返回值.一個(gè)典型的qsort的寫法如下
qsort(s,n,sizeof(s[0]),cmp);
其中第一個(gè)參數(shù)是參與排序的數(shù)組名(或者也可以理解成開始排序的地址,因?yàn)榭梢詫憇[i]
這樣的表達(dá)式,這個(gè)問題下面有說明); 第二個(gè)參數(shù)是參與排序的元素個(gè)數(shù); 第三個(gè)三數(shù)是
單個(gè)元素的大小,推薦使用sizeof(s[0])這樣的表達(dá)式,下面也有說明 :) ;第四個(gè)參數(shù)就是
很多人覺得非常困惑的比較函數(shù)啦,關(guān)于這個(gè)函數(shù),還要說的比較麻煩...
我們來討論cmp這個(gè)比較函數(shù)(寫成cmp是我的個(gè)人喜好,你可以隨便寫成什么,比如qcmp什么
的).典型的cmp的定義是
int cmp(const void *a,const void *b);
返回值必須是int,兩個(gè)參數(shù)的類型必須都是const void *,那個(gè)a,b是我隨便寫的,個(gè)人喜好.
假設(shè)是對(duì)int排序的話,如果是升序,那么就是如果a比b大返回一個(gè)正值,小則負(fù)值,相等返回
0,其他的依次類推,后面有例子來說明對(duì)不同的類型如何進(jìn)行排序.
在函數(shù)體內(nèi)要對(duì)a,b進(jìn)行強(qiáng)制類型轉(zhuǎn)換后才能得到正確的返回值,不同的類型有不同的處理
方法.具體情況請(qǐng)參考后面的例子.
/*----------------------------------------------------------------------------*/
** 關(guān)于快排的一些小問題 **
1.快排是不穩(wěn)定的,這個(gè)不穩(wěn)定一個(gè)表現(xiàn)在其使用的時(shí)間是不確定的,最好情況(O(n))和最
壞情況(O(n^2))差距太大,我們一般說的O(nlog(n))都是指的是其平均時(shí)間.
2.快排是不穩(wěn)定的,這個(gè)不穩(wěn)定表現(xiàn)在如果相同的比較元素,可能順序不一樣,假設(shè)我們有
這樣一個(gè)序列,3,3,3,但是這三個(gè)3是有區(qū)別的,我們標(biāo)記為3a,3b,3c,快排后的結(jié)果不一定
就是3a,3b,3c這樣的排列,所以在某些特定場(chǎng)合我們要用結(jié)構(gòu)體來使其穩(wěn)定(No.6的例子就
是說明這個(gè)問題的)
3.快排的比較函數(shù)的兩個(gè)參數(shù)必須都是const void *的,這個(gè)要特別注意,寫a和b只是我的
個(gè)人喜好,寫成cmp也只是我的個(gè)人喜好.推薦在cmp里面重新定義兩個(gè)指針來強(qiáng)制類型轉(zhuǎn)換,
特別是在對(duì)結(jié)構(gòu)體進(jìn)行排序的時(shí)候
4.快排qsort的第三個(gè)參數(shù),那個(gè)sizeof,推薦是使用sizeof(s[0])這樣,特別是對(duì)結(jié)構(gòu)體,
往往自己定義2*sizeof(int)這樣的會(huì)出問題,用sizeof(s[0)既方便又保險(xiǎn)
5.如果要對(duì)數(shù)組進(jìn)行部分排序,比如對(duì)一個(gè)s[n]的數(shù)組排列其從s[i]開始的m個(gè)元素,只需要
在第一個(gè)和第二個(gè)參數(shù)上進(jìn)行一些修改:qsort(s[i],m,sizeof(s[i]),cmp);
/*----------------------------------------------------------------------------*/
** 標(biāo)程,舉例說明 **
No.1.手工實(shí)現(xiàn)QuickSort
#include stdio.h
int a[100],n,temp;
void QuickSort(int h,int t)
{
if(h=t) return;
int mid=(h+t)/2,i=h,j=t,x;
x=a[mid];
while(1)
{
while(a[i]x) i++;
while(a[j]x) j--;
if(i=j) break;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[mid]=a[j];
a[j]=x;
QuickSort(h,j-1);
QuickSort(j+1,t);
return;
}
int main()
{
int i;
scanf("%d",n);
for(i=0;in;i++) scanf("%d",a[i]);
QuickSort(0,n-1);
for(i=0;in;i++) printf("%d ",a[i]);
return(0);
}
No.2.最常見的,對(duì)int數(shù)組排序
#include stdio.h
#include string.h
#include stdlib.h
int s[10000],n,i;
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
int main()
{
scanf("%d",n);
for(i=0;in;i++) scanf("%d",s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;in;i++) printf("%d ",s[i]);
return(0);
}
No.3.對(duì)double型數(shù)組排序,原理同int
這里做個(gè)注釋,本來是因?yàn)橐袛嗳绻鸻==b返回0的,但是嚴(yán)格來說,兩個(gè)double數(shù)是不可能相等的,只能說fabs(a-b)1e-20之類的這樣來判斷,所以這里只返回了1和-1
#include stdio.h
#include stdlib.h
double s[1000];
int i,n;
int cmp(const void * a, const void * b)
{
return((*(double*)a-*(double*)b0)?1:-1);
}
int main()
{
scanf("%d",n);
for(i=0;in;i++) scanf("%lf",s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;in;i++) printf("%lf ",s[i]);
return(0);
}
No.4.對(duì)一個(gè)字符數(shù)組排序.原理同int
#include stdio.h
#include string.h
#include stdlib.h
char s[10000],i,n;
int cmp(const void *a,const void *b)
{
return(*(char *)a-*(char *)b);
}
int main()
{
scanf("%s",s);
n=strlen(s);
qsort(s,n,sizeof(s[0]),cmp);
printf("%s",s);
return(0);
}
No.5.對(duì)結(jié)構(gòu)體排序
注釋一下.很多時(shí)候我們都會(huì)對(duì)結(jié)構(gòu)體排序,比如校賽預(yù)選賽的那個(gè)櫻花,一般這個(gè)時(shí)候都在
cmp函數(shù)里面先強(qiáng)制轉(zhuǎn)換了類型,不要在return里面轉(zhuǎn),我也說不清為什么,但是這樣程序會(huì)
更清晰,并且絕對(duì)是沒錯(cuò)的. 這里同樣請(qǐng)注意double返回0的問題
#include stdio.h
#include stdlib.h
struct node
{
double date1;
int no;
} s[100];
int i,n;
int cmp(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
return(((aa-date1)(bb-date1))?1:-1);
}
int main()
{
scanf("%d",n);
for(i=0;in;i++)
{
s[i].no=i+1;
scanf("%lf",s[i].date1);
}
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;in;i++) printf("%d %lf\n",s[i].no,s[i].date1);
return(0);
}
No.6.對(duì)結(jié)構(gòu)體排序.加入no來使其穩(wěn)定(即data值相等的情況下按原來的順序排)
#include stdio.h
#include stdlib.h
struct node
{
double date1;
int no;
} s[100];
int i,n;
int cmp(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
if(aa-date1!=bb-date1)
return(((aa-date1)(bb-date1))?1:-1);
else
return((aa-no)-(bb-no));
}
int main()
{
scanf("%d",n);
for(i=0;in;i++)
{
s[i].no=i+1;
scanf("%lf",s[i].date1);
}
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;in;i++) printf("%d %lf\n",s[i].no,s[i].date1);
return(0);
}
No.7.對(duì)字符串?dāng)?shù)組的排序(char s[][]型)
#include stdio.h
#include string.h
#include stdlib.h
char s[100][100];
int i,n;
int cmp(const void *a,const void *b)
{
return(strcmp((char*)a,(char*)b));
}
int main()
{
scanf("%d",n);
for(i=0;in;i++) scanf("%s",s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;in;i++) printf("%s\n",s[i]);
return(0);
}
No.8.對(duì)字符串?dāng)?shù)組排序(char *s[]型)
#include stdio.h
#include string.h
#include stdlib.h
char *s[100];
int i,n;
int cmp(const void *a,const void *b)
{
return(strcmp(*(char**)a,*(char**)b));
}
int main()
{
scanf("%d",n);
for(i=0;in;i++)
{
s[i]=(char*)malloc(sizeof(char*));
scanf("%s",s[i]);
}
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;in;i++) printf("%s\n",s[i]);
return(0);
}
C語言中沒有預(yù)置的sort函數(shù)。如果在C語言中,遇到有調(diào)用sort函數(shù),就是自定義的一個(gè)函數(shù),功能一般用于排序。
一、可以編寫自己的sort函數(shù)。
如下函數(shù)為將整型數(shù)組從小到大排序。
void?sort(int?*a,?int?l)//a為數(shù)組地址,l為數(shù)組長度。
{
int?i,?j;
int?v;
//排序主體
for(i?=?0;?i??l?-?1;?i?++)
for(j?=?i+1;?j??l;?j?++)
{
if(a[i]??a[j])//如前面的比后面的大,則交換。
{
v?=?a[i];
a[i]?=?a[j];
a[j]?=?v;
}
}}
對(duì)于這樣的自定義sort函數(shù),可以按照定義的規(guī)范來調(diào)用。
二、C語言有自有的qsort函數(shù)。
功 能: 使用快速排序例程進(jìn)行排序
頭文件:stdlib.h
原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數(shù):
1 待排序數(shù)組首地址
2 數(shù)組中待排序元素?cái)?shù)量
3 各元素的占用空間大小
4 指向函數(shù)的指針,用于確定排序的順序
這個(gè)函數(shù)必須要自己寫比較函數(shù),即使要排序的元素是int,float一類的C語言基礎(chǔ)類型。
以下是qsort的一個(gè)例子:
#includestdio.h
#includestdlib.h
int?comp(const?void*a,const?void*b)//用來做比較的函數(shù)。
{
return?*(int*)a-*(int*)b;
}
int?main()
{
int?a[10]?=?{2,4,1,5,5,3,7,4,1,5};//亂序的數(shù)組。
int?i;
qsort(a,n,sizeof(int),comp);//調(diào)用qsort排序
for(i=0;i10;i++)//輸出排序后的數(shù)組
{
printf("%d\t",array[i]);
}
return?0;
}
擴(kuò)展資料:
sort函數(shù)的用法(C++排序庫函數(shù)的調(diào)用)
對(duì)數(shù)組進(jìn)行排序,在c++中有庫函數(shù)幫我們實(shí)現(xiàn),這們就不需要我們自己來編程進(jìn)行排序了。
(一)為什么要用c++標(biāo)準(zhǔn)庫里的排序函數(shù)
Sort()函數(shù)是c++一種排序方法之一,學(xué)會(huì)了這種方法也打消我學(xué)習(xí)c++以來使用的冒泡排序和選擇排序所帶來的執(zhí)行效率不高的問題!因?yàn)樗褂玫呐判蚍椒ㄊ穷愃朴诳炫诺姆椒ǎ瑫r(shí)間復(fù)雜度為n*log2(n),執(zhí)行效率較高!
(二)c++標(biāo)準(zhǔn)庫里的排序函數(shù)的使用方法
I)Sort函數(shù)包含在頭文件為#includealgorithm的c++標(biāo)準(zhǔn)庫中,調(diào)用標(biāo)準(zhǔn)庫里的排序方法可以不必知道其內(nèi)部是如何實(shí)現(xiàn)的,只要出現(xiàn)我們想要的結(jié)果即可!
II)Sort函數(shù)有三個(gè)參數(shù):
(1)第一個(gè)是要排序的數(shù)組的起始地址。
(2)第二個(gè)是結(jié)束的地址(最后一位要排序的地址的下一地址)
(3)第三個(gè)參數(shù)是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個(gè)參數(shù),此時(shí)默認(rèn)的排序方法是從小到大排序。
Sort函數(shù)使用模板:
Sort(start,end,排序方法)
下面就具體使用sort()函數(shù)結(jié)合對(duì)數(shù)組里的十個(gè)數(shù)進(jìn)行排序做一個(gè)說明!
例一:sort函數(shù)沒有第三個(gè)參數(shù),實(shí)現(xiàn)的是從小到大
#includeiostream
#includealgorithm
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i10;i++)
couta[i]endl;
sort(a,a+11);
for(int i=0;i10;i++)
couta[i]endl;
return 0;
}
編譯器
GCC,GNU組織開發(fā)的開源免費(fèi)的編譯器
MinGW,Windows操作系統(tǒng)下的GCC
Clang,開源的BSD協(xié)議的基于LLVM的編譯器
Visual C++?:: cl.exe,Microsoft VC++自帶的編譯器
集成開發(fā)環(huán)境
CodeBlocks,開源免費(fèi)的C/C++ IDE
CodeLite,開源、跨平臺(tái)的C/C++集成開發(fā)環(huán)境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
Hello World
參考資料:百度百科-sort函數(shù)
第四個(gè)是回調(diào)函數(shù)的用法
由于qsort規(guī)定是int型函數(shù),所以一定是int型,所以這點(diǎn)他不如c++的sort函數(shù)
const void *代表的是指針常量,即該指針只能指向a,不允許改變指向,保證了指針的安全性
(int *)a是強(qiáng)制將傳進(jìn)來的void 型指針轉(zhuǎn)化為int型指針,*(int *)a的 * 是解析強(qiáng)制轉(zhuǎn)化后int型指針a里面的int型數(shù)據(jù),最后由return返回
文章標(biāo)題:c語言調(diào)用qsort函數(shù)的簡(jiǎn)單介紹
本文鏈接:http://sd-ha.com/article32/hcoepc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站設(shè)計(jì)公司、定制開發(fā)、Google、靜態(tài)網(wǎng)站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)