首先這是一種快速排序的算法,你也應該知道,快速排序就是選擇序列中的一個元素作為基準,通過循環(huán)找到這個基準最終的位置,并把所有小于這個基準的元素移到這個位置的左邊,大于基本的元素移到右邊,這樣再對這個基準的左右兩邊分別遞歸調(diào)用自己,最終就能得到排序的結(jié)果。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都網(wǎng)站設計、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務五河,十余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575
再來解釋一下這個例子,它選擇的基準就是v[(left+right)/2],然后將這個基準雨v[left]交換,現(xiàn)在假設你想從頭排序到最后,則你會將left傳個0,也就是他將這個基準和V[0]交換了,這個時候開始循環(huán),因為第一個元素是基準,所以從第二個元素開始循環(huán)(也就是left+1),然后到if判斷部分,如果v[i]v[left],也就是說這個時候已經(jīng)至少有一個元素比基準小了,所以基準至少在v[1]或者之后了,所以他把你找到的這個比基準小的v[i]和v[++last]交換,這時候v[i]的位置已經(jīng)是在基準的正確位置或者之前了,不會在基準之后的,所以這就實現(xiàn)了把比基準小的元素移到基準的正確位置之前,你說的【第一遍執(zhí)行過程中,第8行l(wèi)ast=left=0,那么到了11行時相當于交換v[1]和v[0+1]】這沒有錯,確實是在自己交換自己,但是這樣并不違背前面的思路不是么?當if條件不滿足的時候,last是不會增加的,但是i會一直加1,所以last和i就會不同,這只是在將比基準小的元素移到基準之前,每有一個比基準小的,last就加1,這樣當你循環(huán)一遍之后的last值就是基準應該在的位置,而且這個時候,所有比基本小的元素也都在last之前了,這時候last位置的元素也是比基準小的,這沒關(guān)系,因為之后還有一句swap[v,last,left],到目前位置,基準的位置找到了,基準左邊的元素都比基準小,右邊都比基準大,再對基準的左右兩邊遞歸調(diào)用自己,就完成了序列的排序。
C語言庫函數(shù),常用庫函數(shù)有:
1、scanf格式輸入函數(shù)
2、printf格式輸出函數(shù)
3、systemdos命令函數(shù)
4、sort排序
5、main主函數(shù)
6、fgets文件讀取字符串函數(shù)
7、fputs文件寫入字符串函數(shù)
8、fscanf文件格式讀取函數(shù)
9、fprintf文件格式寫入函數(shù)
10、fopen打開文件函數(shù)
11、getchar輸入字符函數(shù)
12、putchar輸出字符函數(shù)
13、malloc動態(tài)申請內(nèi)存函數(shù)
14、free釋放內(nèi)存函數(shù)
15、abs求絕對值數(shù)學函數(shù)
16、sqrt求平方根數(shù)學函數(shù)
擴展資料
語言組成:
1、數(shù)據(jù)類型
C的數(shù)據(jù)類型包括:整型、字符型、實型或浮點型(單精度和雙精度)、枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。
2、常量與變量
常量其值不可改變,符號常量名通常用大寫。
變量是以某標識符為名字,其值可以改變的量。標識符是以字母或下劃線開頭的一串由字母、數(shù)字或下劃線構(gòu)成的序列,請注意第一個字符必須為字母或下劃線,否則為不合法的變量名。變量在編譯時為其分配相應存儲單元。
3、數(shù)組
如果一個變量名后面跟著一個有數(shù)字的中括號,這個聲明就是數(shù)組聲明。字符串也是一種數(shù)組。它們以ASCII的NULL作為數(shù)組的結(jié)束。要特別注意的是,方括內(nèi)的索引值是從0算起的。
4、指針
如果一個變量聲明時在前面使用 * 號,表明這是個指針型變量。換句話說,該變量存儲一個地址,而 *(此處特指單目運算符 * ,下同。C語言中另有 雙目運算符 *) 則是取內(nèi)容操作符,意思是取這個內(nèi)存地址里存儲的內(nèi)容。指針是 C 語言區(qū)別于其他同時代高級語言的主要特征之一。
參考資料來源:百度百科-函數(shù)
include cstdlib 或 #include stdlib.h
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
參數(shù)表
*base: 待排序的元素(數(shù)組,下標0起)。
num: 元素的數(shù)量。
width: 每個元素的內(nèi)存空間大?。ㄒ宰止?jié)為單位)??捎胹izeof()測得。
int(*)compare: 指向一個比較函數(shù)。*elem1 *elem2: 指向待比較的數(shù)據(jù)。
比較函數(shù)的返回值
返回值是int類型,確定elem1與elem2的相對位置。
elem1在elem2右側(cè)返回正數(shù),elem1在elem2左側(cè)返回負數(shù)。
控制返回值可以確定升序/降序。
產(chǎn)生隨機數(shù)的函數(shù)也是rand(),不是rank().
C語言中沒有預置的sort函數(shù)。如果在C語言中,遇到有調(diào)用sort函數(shù),就是自定義的一個函數(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;
}
}}
對于這樣的自定義sort函數(shù),可以按照定義的規(guī)范來調(diào)用。
二、C語言有自有的qsort函數(shù)。
功 能: 使用快速排序例程進行排序
頭文件:stdlib.h
原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數(shù):
1 待排序數(shù)組首地址
2 數(shù)組中待排序元素數(shù)量
3 各元素的占用空間大小
4 指向函數(shù)的指針,用于確定排序的順序
這個函數(shù)必須要自己寫比較函數(shù),即使要排序的元素是int,float一類的C語言基礎類型。
以下是qsort的一個例子:
#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;
}
擴展資料:
sort函數(shù)的用法(C++排序庫函數(shù)的調(diào)用)
對數(shù)組進行排序,在c++中有庫函數(shù)幫我們實現(xiàn),這們就不需要我們自己來編程進行排序了。
(一)為什么要用c++標準庫里的排序函數(shù)
Sort()函數(shù)是c++一種排序方法之一,學會了這種方法也打消我學習c++以來使用的冒泡排序和選擇排序所帶來的執(zhí)行效率不高的問題!因為它使用的排序方法是類似于快排的方法,時間復雜度為n*log2(n),執(zhí)行效率較高!
(二)c++標準庫里的排序函數(shù)的使用方法
I)Sort函數(shù)包含在頭文件為#includealgorithm的c++標準庫中,調(diào)用標準庫里的排序方法可以不必知道其內(nèi)部是如何實現(xiàn)的,只要出現(xiàn)我們想要的結(jié)果即可!
II)Sort函數(shù)有三個參數(shù):
(1)第一個是要排序的數(shù)組的起始地址。
(2)第二個是結(jié)束的地址(最后一位要排序的地址的下一地址)
(3)第三個參數(shù)是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個參數(shù),此時默認的排序方法是從小到大排序。
Sort函數(shù)使用模板:
Sort(start,end,排序方法)
下面就具體使用sort()函數(shù)結(jié)合對數(shù)組里的十個數(shù)進行排序做一個說明!
例一:sort函數(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ā)的開源免費的編譯器
MinGW,Windows操作系統(tǒng)下的GCC
Clang,開源的BSD協(xié)議的基于LLVM的編譯器
Visual C++?:: cl.exe,Microsoft VC++自帶的編譯器
集成開發(fā)環(huán)境
CodeBlocks,開源免費的C/C++ IDE
CodeLite,開源、跨平臺的C/C++集成開發(fā)環(huán)境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
Hello World
參考資料:百度百科-sort函數(shù)
sort不屬于C語言的標準函數(shù),所以也沒有相應的頭文件,但是可以自定義。
sort?函數(shù)為將整型數(shù)組從小到大排序。
voidsort(int*a,intl)//a為數(shù)組地址,l為數(shù)組長度。
{
inti,j;
intv;
//排序主體
for(i=0;il-1;i++)
for(j=i+1;jl;j++)
{
if(a[i]a[j])//如前面的比后面的大,則交換。
{
v=a[i];
a[i]=a[j];
a[j]=v;
}
}}
擴展資料
c語言自有的qsort函數(shù)
#includestdio.h
#includestdlib.h
intcomp(constvoid*a,constvoid*b)//用來做比較的函數(shù)。
{
return*(int*)a-*(int*)b;
}
intmain()
{
inta[10]={2,4,1,5,5,3,7,4,1,5};//亂序的數(shù)組。
inti;
qsort(a,n,sizeof(int),comp);//調(diào)用qsort排序
for(i=0;i10;i++)//輸出排序后的數(shù)組
{
printf("%d\t",array[i]);
}
return0;
}