




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第第頁幾種常見內(nèi)部排序算法比較這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
常見內(nèi)部排序算法比較
排序算法是數(shù)據(jù)結(jié)構(gòu)學(xué)科經(jīng)典的內(nèi)容,其中內(nèi)部排序現(xiàn)有的算法有許多種,到底各有什么特點(diǎn)呢?本文力圖設(shè)計實(shí)現(xiàn)常用內(nèi)部排序算法并進(jìn)行比較。分別為起泡排序,徑直插入排序,簡約選擇排序,快速排序,堆排序,針對關(guān)鍵字的比較次數(shù)和移動次數(shù)進(jìn)行測試比較。
問題分析和總體設(shè)計
ADTOrderableList
{
數(shù)據(jù)對象:D={ai|ai∈IntegerSet,i=1,2,…,n,n≥0}
數(shù)據(jù)關(guān)系:R1={〈ai-1,ai〉|ai-1,ai∈D,i=1,2,…,n}
基本操作:
InitList(n)
操作結(jié)果:構(gòu)造一個長度為n,元素值依次為1,2,…,n的有序表。Randomizel(d,isInverseOrser)
操作結(jié)果:隨機(jī)打亂
BubbleSort()
操作結(jié)果:進(jìn)行起泡排序
InserSort()
操作結(jié)果:進(jìn)行插入排序
SelectSort()
操作結(jié)果:進(jìn)行選擇排序
QuickSort()
操作結(jié)果:進(jìn)行快速排序
HeapSort()
操作結(jié)果:進(jìn)行堆排序
ListTraverse(visit())
操作結(jié)果:依次對L種的每個元素調(diào)用函數(shù)visit()
}ADTOrderableList
待排序表的元素的關(guān)鍵字為整數(shù).用正序,逆序和不同亂序程度的不同數(shù)據(jù)做測試比較,對關(guān)鍵字的比較次數(shù)和移動次數(shù)(關(guān)鍵字交換計為3次移動)進(jìn)行測試比較.要求顯示提示信息,用戶由鍵盤輸入待排序表的表長(100-1000)和不同測試數(shù)據(jù)的組數(shù)(8-18).每次測試完畢,要求列表現(xiàn)是比較結(jié)果.
要求對結(jié)果進(jìn)行分析.
這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
具體設(shè)計
1、起泡排序
算法:核心思想是掃描數(shù)據(jù)清單,查找涌現(xiàn)亂序的兩個相鄰的項(xiàng)目。當(dāng)找到這兩個項(xiàng)目后,交換項(xiàng)目的位置然后繼續(xù)掃描。重復(fù)上面的操作直到全部的項(xiàng)目都按順次排好。
bubblesort(structrecr[],intn)
{
inti,j;
structrecw;
unsignedlongintcompare=0,move=0;
for(i=1;i=n-1;i++)
for(j=n;j=i+1;j--)
{
if(r[j].keyr[j-1].key)
{
w=r[j];
r[j]=r[j-1];
r[j-1]=w;
move=move+3;
}
compare++;
}
printf(\nBubbleSortcompare=%ld,move=%ld\n,compare,move);}
2、徑直插入排序
算法:經(jīng)過i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當(dāng)位置,使得L[1..i]又是排好序的序列。要達(dá)到這個目的,我們可以用順次比較的方法。首先比較L[i]和L[i-1],假如L[i-1]≤L[i],那么L[1..i]已排好序,第i遍處理就結(jié)束了;否那么交換L[i]與L[i-1]的位置,繼續(xù)比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j]≤L[j+1]時為止。
insertsort(structrecr[],intn)
{
inti,j;
unsignedlongintcompare=0,move=0;
這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
for(i=2;i=n;i++)
{compare++;
r[0]=r[i];
move++;
j=i-1;
while(r[0].key{r[j+1]=r[j];
j--;
move++;
++compare;}
r[j+1]=r[0];
move++;
}
printf(\nInsertSortcompare=%ld,move=%ld\n,compare,move);}
3、簡約選擇排序
算法:首先找到數(shù)據(jù)清單中的最小的數(shù)據(jù),然后將這個數(shù)據(jù)同第一個數(shù)據(jù)交換位置;接下來找第二小的數(shù)據(jù),再將其同第二個數(shù)據(jù)交換位置,以此類推。
selectsort(structrecr[],intn)
{
unsignedlongintcompare=0,move=0;
inti,j,k;
structrecw;
for(i=1;i=n-1;i++)
{k=i;
for(j=i+1;j=n;j++)
{if(r[j].keyr[k].key){k=j;compare++;}
w=r[i];
r[i]=r[k];
r[k]=w;
move=move+3;
}
}
printf(\nSelectSortcompare=%ld,move=%ld\n,compare,move);}
4、快速排序
這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
算法:首先檢查數(shù)據(jù)列表中的數(shù)據(jù)數(shù),假如小于兩個,那么徑直退出程序。假如有超過兩個以上的數(shù)據(jù),就選擇一個分割點(diǎn)將數(shù)據(jù)分成兩個部分,小于分割點(diǎn)的數(shù)據(jù)放在一組,其余的放在另一組,然后分別對兩組數(shù)據(jù)排序。通常分割點(diǎn)的數(shù)據(jù)是隨機(jī)選取的。這樣無論你的數(shù)據(jù)是否已被排列過,你所分割成的兩個字列表的大小是差不多的。而只要兩個子列表的大小差不多。
q(structrecr[],ints,intt)
{
inti=s,j=t;
if(st)
{
r[0]=r[s];++a;c++;
do{
while(jir[j].key=r[0].key)
{j--;
++a;}
if(ij)
{r[i]=r[j];
i++;
c++;}
while(ijr[i].key=r[0].key)
{i++;
++a;}
if(ij)
{r[j]=r[i];
j--;
c++;}
}while(ij);
r[i]=r[0];
c++;
q(r,s,j-1);
q(r,j+1,t);
}
}
5.堆排序
基本思想:堆排序是一樹形選擇排序,在排序過程中,將R[1..N]看成是一顆完全二叉樹的順次存儲結(jié)構(gòu),利用完全二叉樹中雙親結(jié)點(diǎn)和孩子結(jié)點(diǎn)之間的內(nèi)在關(guān)系來選擇最小的元素。
(2)堆的定義:N個元素的序列K1,K2,K3,...,Kn.稱為堆,當(dāng)且僅當(dāng)該序列滿意特性:
這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
Ki≤K2iKi≤K2i+1(1≤I≤[N/2])
sift(structrecr[],intl,intm)
{
inti,j;
structrecw;
i=l;j=2*i;
w=r[i];
while(j=m)
{
if(jmr[j].keyr[j+1].key){j++;
}
if(w.keyr[j].key)
{
r[i]=r[j];
i=j;
j=2*i;
}
elsej=m+1;
}
r[i]=w;
}
heapsort(structrecr[],intn)
{
unsignedlongintcompare=-1,move=-1;
structrecw;
inti;
inta;
for(i=n/2;i=1;i--)a=sift(r,i,n);
compare++;
move++;
for(i=n;i=2;i--)
{
w=r[i];
r[i]=r[1];
r[1]=w;
a=sift(r,1,i-1);
compare+=a;
move+=a;
}
}
這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
小結(jié):
1.學(xué)會運(yùn)用隨機(jī)函數(shù)randomize()為數(shù)組賦初值要在頭文件中添加#include。
2.在做此程序之前基本上是在理解了各種排序過程以后完成的。
3.對排序算法的總結(jié):
(1)假設(shè)n較小(如n≤50),可采納徑直插入或徑直選擇排序。當(dāng)記錄規(guī)模較小時,徑直插入排序較好;否那么由于徑直選擇移動的記錄數(shù)少于徑直插人,應(yīng)選徑直選擇排序?yàn)橐恕?/p>
(2)假設(shè)文件初始狀態(tài)基本有序(指正序),那么應(yīng)選用徑直插人、冒泡或隨機(jī)的快速排序?yàn)橐耍?/p>
(3)假設(shè)n較大,那么應(yīng)采納時間繁復(fù)度為O(nlgn)的排序方法:快速排序、堆排序或歸并排序。
快速排序是目前基于比較的內(nèi)部排序中被認(rèn)為是最好的方法,當(dāng)待排序的關(guān)鍵字是隨機(jī)分布時,快速排序的平均時間最短;堆排序所需的幫助空間少于快速排序,并且不會涌現(xiàn)快速排序可能涌現(xiàn)的最壞狀況。這兩種排序都是不穩(wěn)定的。
這是在我高校期間學(xué)習(xí)C語言時學(xué)到的幾種常見的內(nèi)部排序算法的。在高校期間,計算機(jī)相關(guān)專業(yè)的同學(xué),只要掌控這幾種排序算法就已經(jīng)足夠了!
常見內(nèi)部排序算法比較
排序算法是數(shù)據(jù)結(jié)構(gòu)學(xué)科經(jīng)典的內(nèi)容,其中內(nèi)部排序現(xiàn)有的算法有許多種,到底各有什么特點(diǎn)呢?本文力圖設(shè)計實(shí)現(xiàn)常用內(nèi)部排序算法并進(jìn)行比較。分別為起泡排序,徑直插入排序,簡約選擇排序,快速排序,堆排序,針對關(guān)鍵字的比較次數(shù)和移動次數(shù)進(jìn)行測試比較。
問題分析和總體設(shè)計
ADTOrderableList
{
數(shù)據(jù)對象:D={ai|ai∈IntegerSet,i=1,2,…,n,n≥0}
數(shù)據(jù)關(guān)系:R1={〈ai-1,ai〉|ai-1,ai∈D,i=1,2,…,n}
基本操作:
InitList(n)
操作結(jié)果:構(gòu)造一個長度為n,元素值依次為1,2,…,n的有序表。Randomizel(d,isInverseOrser)
操作結(jié)果:隨機(jī)打亂
BubbleSort()
操作結(jié)果:進(jìn)行起泡排序
InserSort()
操作結(jié)果:進(jìn)行插入排序
SelectSort()
操作結(jié)果:進(jìn)行選擇排序
QuickSort()
操作結(jié)果:進(jìn)行快速排序
HeapSort()
操作結(jié)果:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 十五后買賣合同范例
- 修路聯(lián)營協(xié)議合同范例
- 2025年動物胎盤蛋白項(xiàng)目發(fā)展計劃
- 分期付款買賣合同范例
- 制約合同范例
- 2025年公路旅客運(yùn)輸服務(wù)項(xiàng)目建議書
- 班主任管理工作計劃模板10篇
- 避免盲目創(chuàng)業(yè):理性思考與策略規(guī)劃
- 2025年航空、航天設(shè)備相關(guān)專用設(shè)備項(xiàng)目發(fā)展計劃
- 針灸治療斑禿
- PCBA紅膠工藝貼片掉件改善(6Sigma改善報告)
- 社會主義發(fā)展簡史智慧樹知到課后章節(jié)答案2023年下北方工業(yè)大學(xué)
- 2022年考研數(shù)學(xué)(二)真題(含答案及解析)【可編輯】
- 幼兒園班本課程《再見吧幼兒園》
- 記賬憑證封面直接打印模板
- 食物中心溫度測試記錄表
- 溝槽式連接管道工程技術(shù)規(guī)程
- 社會保障學(xué)(全套課件617P)
- 安全事故原因及防治措施
- 1安全生產(chǎn)周巡查表
- 10kV電流互感器試驗(yàn)檢測試驗(yàn)報告
評論
0/150
提交評論