rand()函數(shù)應(yīng)該知道吧,一般的排序算法:選擇,冒泡什么的算法?;亓司涂梢詫懥恕O扔?/p>
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供臺(tái)安網(wǎng)站建設(shè)、臺(tái)安做網(wǎng)站、臺(tái)安網(wǎng)站設(shè)計(jì)、臺(tái)安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、臺(tái)安企業(yè)網(wǎng)站模板建站服務(wù),10年臺(tái)安做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
先定義一個(gè)數(shù)組,然后用rand()函數(shù)生成隨機(jī)數(shù)給數(shù)組的每個(gè)元素賦值,然后排序。。。這樣就完成了。。。希望樓主能夠堅(jiān)持,自己做出來(lái)的才是最有成就感的,可能實(shí)現(xiàn)的時(shí)候邏輯還是不清晰,代碼也不是很漂亮,這都是一個(gè)必須經(jīng)歷的過(guò)程。我當(dāng)初學(xué)語(yǔ)言的時(shí)候,也有過(guò)花幾天寫一個(gè)很簡(jiǎn)單的程序。。。由此喜歡編程。。。。不羅嗦了,樓主整理思路,繼續(xù)調(diào)試吧。
首先這是一種快速排序的算法,你也應(yīng)該知道,快速排序就是選擇序列中的一個(gè)元素作為基準(zhǔn),通過(guò)循環(huán)找到這個(gè)基準(zhǔn)最終的位置,并把所有小于這個(gè)基準(zhǔn)的元素移到這個(gè)位置的左邊,大于基本的元素移到右邊,這樣再對(duì)這個(gè)基準(zhǔn)的左右兩邊分別遞歸調(diào)用自己,最終就能得到排序的結(jié)果。
再來(lái)解釋一下這個(gè)例子,它選擇的基準(zhǔn)就是v[(left+right)/2],然后將這個(gè)基準(zhǔn)雨v[left]交換,現(xiàn)在假設(shè)你想從頭排序到最后,則你會(huì)將left傳個(gè)0,也就是他將這個(gè)基準(zhǔn)和V[0]交換了,這個(gè)時(shí)候開(kāi)始循環(huán),因?yàn)榈谝粋€(gè)元素是基準(zhǔn),所以從第二個(gè)元素開(kāi)始循環(huán)(也就是left+1),然后到if判斷部分,如果v[i]v[left],也就是說(shuō)這個(gè)時(shí)候已經(jīng)至少有一個(gè)元素比基準(zhǔn)小了,所以基準(zhǔn)至少在v[1]或者之后了,所以他把你找到的這個(gè)比基準(zhǔn)小的v[i]和v[++last]交換,這時(shí)候v[i]的位置已經(jīng)是在基準(zhǔn)的正確位置或者之前了,不會(huì)在基準(zhǔn)之后的,所以這就實(shí)現(xiàn)了把比基準(zhǔn)小的元素移到基準(zhǔn)的正確位置之前,你說(shuō)的【第一遍執(zhí)行過(guò)程中,第8行l(wèi)ast=left=0,那么到了11行時(shí)相當(dāng)于交換v[1]和v[0+1]】這沒(méi)有錯(cuò),確實(shí)是在自己交換自己,但是這樣并不違背前面的思路不是么?當(dāng)if條件不滿足的時(shí)候,last是不會(huì)增加的,但是i會(huì)一直加1,所以last和i就會(huì)不同,這只是在將比基準(zhǔn)小的元素移到基準(zhǔn)之前,每有一個(gè)比基準(zhǔn)小的,last就加1,這樣當(dāng)你循環(huán)一遍之后的last值就是基準(zhǔn)應(yīng)該在的位置,而且這個(gè)時(shí)候,所有比基本小的元素也都在last之前了,這時(shí)候last位置的元素也是比基準(zhǔn)小的,這沒(méi)關(guān)系,因?yàn)橹筮€有一句swap[v,last,left],到目前位置,基準(zhǔn)的位置找到了,基準(zhǔn)左邊的元素都比基準(zhǔn)小,右邊都比基準(zhǔn)大,再對(duì)基準(zhǔn)的左右兩邊遞歸調(diào)用自己,就完成了序列的排序。
修改后的程序
#include stdio.h
#define n 7
int main()
{
int i,j,ptr_2=0;
int a[n],*ptr_1;
ptr_1=a[0];
printf("輸入%d個(gè)數(shù):",n);
for (i=0;in;i++)
{
scanf("%d",a[i]);
}
printf("ok1\n");
for(i=0;in;i++)
{
for(j=0;jn-i-1;j++)
{
if (*(ptr_1+j) *(ptr_1+j+1))
{
ptr_2=*(ptr_1+j+1);
*(ptr_1+j+1)=*(ptr_1+j);
*(ptr_1+j)=ptr_2;
}
}
}
printf("排序后的數(shù)為: ");
for(i=0;in;i++)
{
printf("%d ",*ptr_1);
ptr_1++;
}
printf("\n");
return 0;
}
注意ptr_2是指針,未申請(qǐng)空間不能*ptr_2復(fù)值。
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ù)組,下標(biāo)0起)。
num: 元素的數(shù)量。
width: 每個(gè)元素的內(nèi)存空間大?。ㄒ宰止?jié)為單位)??捎胹izeof()測(cè)得。
int(*)compare: 指向一個(gè)比較函數(shù)。*elem1 *elem2: 指向待比較的數(shù)據(jù)。
比較函數(shù)的返回值
返回值是int類型,確定elem1與elem2的相對(duì)位置。
elem1在elem2右側(cè)返回正數(shù),elem1在elem2左側(cè)返回負(fù)數(shù)。
控制返回值可以確定升序/降序。
產(chǎn)生隨機(jī)數(shù)的函數(shù)也是rand(),不是rank().
分享題目:C語(yǔ)言電話訂餐系排序函數(shù) c語(yǔ)言電話訂餐系統(tǒng)設(shè)計(jì)
分享路徑:http://jinyejixie.com/article12/dodojdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、建站公司、外貿(mào)建站、全網(wǎng)營(yíng)銷推廣、Google、虛擬主機(jī)
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)