數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(內(nèi)部排序之堆排序)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(內(nèi)部排序之堆排序)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(內(nèi)部排序之堆排序)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(內(nèi)部排序之堆排序)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(內(nèi)部排序之堆排序)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)設(shè)計(jì)說(shuō)明書(shū)內(nèi)部排序之堆排序的實(shí)現(xiàn)學(xué)生姓名 羅通 學(xué) 號(hào) 1118014124 班 級(jí) 計(jì)本1104班 成 績(jī) 指導(dǎo)教師 林勇 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院 2013年9月9日 課程設(shè)計(jì)任務(wù)書(shū)20132014學(xué)年第一學(xué)期課程設(shè)計(jì)名稱(chēng): 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 課程設(shè)計(jì)題目: 內(nèi)部堆排序算法的實(shí)現(xiàn) 完 成 期 限:自 2013年 9月9日至 2013年 9月 21 日共 2 周設(shè)計(jì)內(nèi)容:1.任務(wù)說(shuō)明堆排序是數(shù)據(jù)結(jié)構(gòu)中內(nèi)排序部分的重點(diǎn)知識(shí)。堆分為大頂堆和小頂堆。堆排序的過(guò)程主要解決兩個(gè)問(wèn)題

2、:(1)把無(wú)序序列建成一個(gè)堆;(2)輸出堆頂元素后,重新將剩余元素調(diào)整成新堆。本課程設(shè)計(jì)主要完成的核心內(nèi)容即為此。按以下的要求運(yùn)用C/ C+結(jié)構(gòu)體、指針、數(shù)據(jù)結(jié)構(gòu)等基知識(shí)編程實(shí)現(xiàn)。2.要求1)問(wèn)題分析和任務(wù)定義:根據(jù)設(shè)計(jì)題目的要求,充分地分析和理解問(wèn)題,明確問(wèn)題要求做什么? 2)邏輯設(shè)計(jì):寫(xiě)出抽象數(shù)據(jù)類(lèi)型的定義,各個(gè)主要模塊的算法,并畫(huà)出模塊之間的調(diào)用關(guān)系圖;3)詳細(xì)設(shè)計(jì):定義相應(yīng)的存儲(chǔ)結(jié)構(gòu)并寫(xiě)出各函數(shù)的偽碼算法。4)程序編碼:把詳細(xì)設(shè)計(jì)的結(jié)果進(jìn)一步求精為程序設(shè)計(jì)語(yǔ)言程序。5)程序調(diào)試與測(cè)試:采用自底向上,分模塊進(jìn)行,即先調(diào)試低層函數(shù)。6)結(jié)果分析:程序運(yùn)行結(jié)果包括正確的輸入及其輸出結(jié)果和含有

3、錯(cuò)誤的輸入及其輸出結(jié)果。算法的時(shí)間、空間復(fù)雜性分析;7)編寫(xiě)課程設(shè)計(jì)報(bào)告;3.參考資料指導(dǎo)教師:林勇 教研室負(fù)責(zé)人:曹陽(yáng)課程設(shè)計(jì)評(píng)閱評(píng)語(yǔ): 指導(dǎo)教師簽名: 年 月 日摘 要 為了查找方便,通常希望通過(guò)排序使表成為按鍵字有序的。本課題利用簡(jiǎn)單排序的堆排序方法,通過(guò)建立大根堆,并對(duì)元素進(jìn)行輸出,實(shí)現(xiàn)用戶(hù)輸入的一組可以組成堆的數(shù)據(jù)元素進(jìn)行處理,使其按關(guān)鍵字排成一個(gè)有序的序列,從而有效的提高了查找效率。再加上界面友好、操作簡(jiǎn)單,使其更加好用。關(guān)鍵詞:堆 排序 查找 流程控制 目 錄 1.課題描述- 2.需求分析- 2.0算法分析- 2.1 抽象數(shù)據(jù)類(lèi)型定義- 2.2程序設(shè)計(jì)流程圖- 3. 各函數(shù)功能實(shí)

4、現(xiàn)及調(diào)用關(guān)系- 3.1各函數(shù)功能實(shí)現(xiàn)- 3.2 各函數(shù)之間的調(diào)用關(guān)系- 4. 主代碼- 5.程序運(yùn)行測(cè)試與結(jié)果分析- 5.1函數(shù)功能檢驗(yàn)與各步運(yùn)行結(jié)果的說(shuō)明(圖)- 5.2出錯(cuò)狀況的解決(圖)- 5.3 時(shí)間復(fù)雜度與空間復(fù)雜度- 6.總結(jié)- 參考文獻(xiàn)- 1 課題描述在現(xiàn)在帶生活的各個(gè)領(lǐng)域里,人們?yōu)榱瞬檎曳奖?,通常希望?jì)算機(jī)中的表是按關(guān)鍵字有序的。因此排序就成了計(jì)算機(jī)程序設(shè)計(jì)中的一種重要操作。本課題利用簡(jiǎn)單選擇排序中的堆排序方法,通過(guò)對(duì)用戶(hù)輸入的可以組成堆的數(shù)據(jù)元素建立大、小根堆,并將其進(jìn)行排序輸出,使其成為一個(gè)按關(guān)鍵字排序的有序序列,從而有效地提高了查找的效率。開(kāi)發(fā)工具:vc+6.02 問(wèn)題分

5、析 2.0算法分析 堆的定義如下:n個(gè)元素的序列k1,k2,.,kn當(dāng)且僅當(dāng)滿(mǎn)足下關(guān)系時(shí),稱(chēng)堆。 Ki<=k2i ;ki<=k2i+1 或者 ki=>k2i; ki=>k2i+1(i = 1,2,3.,n/2)若將和此序列對(duì)應(yīng)的一維數(shù)組(即以一維數(shù)組作為數(shù)列的存儲(chǔ)結(jié)構(gòu))看成是一個(gè)完全二叉樹(shù),則堆的含義表明,完全二叉樹(shù)中所有的非終端節(jié)點(diǎn)的值均不小于(或不大于)其左右孩子節(jié) 點(diǎn)的值,由此,若序列k1,k2,.,kn是堆,則堆頂元素必為序列中n個(gè)元素的最大值。 2.1抽象數(shù)據(jù)類(lèi)型定義 ADT HeapSort 數(shù)據(jù)對(duì)象: D=ki|ki屬于Elemset,i = 1,2,3.

6、,n,n=>0; 數(shù)據(jù)關(guān)系:R1=<ki,k2i,k2i+1>|Ki<=k2i;ki<=k2i+1或 ki=>k2i;ki=>k2i+1 ; 基本操作: void SCANF(Heap* list); 操作結(jié)果:輸入的一組數(shù)據(jù)存入順序表中 void HeapAdjustlittle(Heap* list,int s,int m); 初始條件:list中存有一組無(wú)序數(shù)列 操作結(jié)果:將list中的無(wú)序數(shù)列調(diào)整為一個(gè)小頂堆 void HeapSortlittle(Heap*list); 操作結(jié)果:把調(diào)整好的小頂堆進(jìn)行排序并進(jìn)行再調(diào)整 void HeapAdj

7、ustbig(Heap* list,int s,int m); 初始條件:list中存有一組無(wú)序數(shù)列 操作結(jié)果:將list中的無(wú)序數(shù)列調(diào)整為一個(gè)大頂堆 void HeapSortbig(Heap*list); 操作結(jié)果:把調(diào)整好的小頂堆進(jìn)行排序并進(jìn)行再調(diào)整 void PRINTF1(Heap*list); 操作結(jié)果:將排好的或者正在排列的序列進(jìn)行堆型輸出 void PRINTF2(Heap*list); 操作結(jié)果:輸出最終升序或者降序排序結(jié)果 ADT HeapSort 2.2 程序設(shè)計(jì)流程圖(以大頂堆的設(shè)計(jì)為例)2.2.1整體設(shè)計(jì)思想流程圖:圖2.1 整體設(shè)計(jì)思想流程圖2.2.2函數(shù)設(shè)計(jì)流程圖

8、 建堆函數(shù)HeapAdjust:堆的定義如下:n個(gè)元素的序列k1,k2,.,kn當(dāng)且僅當(dāng)滿(mǎn)足下關(guān)系時(shí),稱(chēng)堆。Ki<=k2i ;ki<=k2i+1 或者 ki=>k2i; ki=>k2i+1(i = 1,2,3.,n/2)若將和此序列對(duì)應(yīng)的一維數(shù)組(即以一維數(shù)組作為數(shù)列的存儲(chǔ)結(jié)構(gòu))看成是一個(gè)完全二叉樹(shù),則堆的含義表明,完全二叉樹(shù)中所有的非終端節(jié)點(diǎn)的值均不小于(或不大于)其左右孩子節(jié)點(diǎn)的值,由此,若序列k1,k2,.,kn是堆,則堆頂元素必為序列中n個(gè)元素的最大值。 建立大頂堆函數(shù)的程序流程圖如圖2.2。圖2.2 建立大頂堆函數(shù)的程序流程圖輸出堆形函數(shù)PRINTF1: 在堆

9、排序的函數(shù)中,結(jié)果用堆型的動(dòng)態(tài)變化來(lái)反映無(wú)疑是最好的。因此,就要設(shè)計(jì)良好的流程控制來(lái)反映出程序運(yùn)行結(jié)果中的堆型。輸出大頂堆函數(shù)的程序流程圖如圖2.3。圖2.3 輸出大頂堆函數(shù)的程序流程圖3 各函數(shù)功能的實(shí)現(xiàn) 3.1 各函數(shù)的功能實(shí)現(xiàn)/大頂堆的建立void HeapAdjustbig(Heap* list,int s,int m) int j; Heap rc; rc = lists; for(j=2*s;j<=m;j*=2) if(j<m&&(listj.key<listj+1.key) +j; if(!(rc.key<listj.key) break;

10、 lists = listj; s = j;lists = rc;/小頂堆的建立void HeapAdjustlittle(Heap* list,int s,int m)int j;Heap rc;rc = lists;for(j=2*s;j<=m;j*=2)if(j<m&&(listj.key>listj+1.key)+j;if(!(rc.key>listj.key)break;lists = listj;s = j;lists = rc;/輸出堆函數(shù)(輸出堆型)void PRINTF1(Heap* list) int h=0,sum=0,item=1

11、; int cnt=1,tmp=1; while(sum<=list0.key) sum+=item; h+; item*=2; /求出堆所對(duì)應(yīng)的完全二叉樹(shù)的高度h。 printf("-n"); printf("堆排序堆型如下n"); while(1) for(int i=0;i<h;i+) for(int j=0;j<h-i;j+) printf(" "); for(j=0;j<tmp;j+) if(cnt>list0.key)goto end; printf("%5d",listc

12、nt+); printf("n");tmp*=2; end: printf("n"); /輸出已排序數(shù)組函數(shù)void PRINTF2(Heap* list) printf("IN THE END 最終經(jīng)過(guò)堆排序后的序列為:"); for(int i=1;i<=list0.key;i+) printf("%d ",listi.key); printf("n");3.2各函數(shù)之間的調(diào)用關(guān)系 箭頭指向主調(diào)函數(shù),箭尾為被調(diào)函數(shù)4.主代碼#include<stdio.h>#include

13、<stdlib.h>typedef struct NODEint key; Heap;void SCANF(Heap* list);void HeapAdjustlittle(Heap* list,int s,int m);void HeapAdjustbig(Heap* list,int s,int m);void HeapSortlittle(Heap*list);void HeapSortbig(Heap*list);void PRINTF1(Heap*list);void PRINTF2(Heap*list);/桌面顯示個(gè)人信息void desktop()printf(&q

14、uot;ttt2013-2014年計(jì)算機(jī)系課程設(shè)計(jì)");printf("nn");printf("ttnn");printf("tt 班級(jí): 計(jì)本1104班 nn");printf("tt 姓名: 羅 通 nn");printf("tt 學(xué)號(hào): 1118014124 nn");printf("tt 課題: 內(nèi)部排序之堆排序 nn");printf("ttnn");/用順序表來(lái)存儲(chǔ)堆void SCANF(Heap* list)printf(&quo

15、t;請(qǐng)輸入你要排序的序列的個(gè)數(shù):");scanf("%d",&list0.key);if(list0.key >15)printf("對(duì)不起,現(xiàn)在暫時(shí)只分配了表長(zhǎng)為15的順序表!nn");printf("請(qǐng)輸入小于15的值,或者手動(dòng)將主函數(shù)里分配表長(zhǎng)改為你想要的值!nn");exit(0);printf("n");printf("請(qǐng)輸入你要排序的數(shù)列:");for(int i=1;i<=list0.key;i+)scanf("%d",&l

16、isti.key);if(sizeof(1 = listi.key)printf("請(qǐng)輸入正確的數(shù)據(jù)(整形數(shù)字)。nn");exit(0);elseprintf("t");printf("n");/調(diào)整堆為大頂堆void HeapAdjustbig(Heap* list,int s,int m) int j; Heap rc; rc = lists; for(j=2*s;j<=m;j*=2) if(j<m&&(listj.key<listj+1.key)+j; if(!(rc.key<listj

17、.key)break; lists = listj; s = j; lists = rc;/輸出堆頂元素開(kāi)始進(jìn)行堆排序void HeapSortbig(Heap*list) Heap p; for(int i=list0.key/2,m=1;i>0;-i,+m) HeapAdjustbig(list,i,list0.key); printf("經(jīng)過(guò)%d次調(diào)整的堆序列為:",m); for(int j=1;j<=list0.key;j+) printf("%d ",listj.key); printf("相應(yīng)的堆形為:n")

18、; PRINTF1( list); printf("nn"); for(i=list0.key;i>1;-i) p = list1; list1 = listi; listi = p; HeapAdjustbig(list,1,i-1); /調(diào)整堆為小頂堆void HeapAdjustlittle(Heap* list,int s,int m) int j; Heap rc; rc = lists; for(j=2*s;j<=m;j*=2) if(j<m&&(listj.key>listj+1.key) +j; if(!(rc.key

19、>listj.key) break; lists = listj; s = j; lists = rc;/輸出堆頂元素開(kāi)始進(jìn)行堆排序void HeapSortlittle(Heap*list) Heap p; for(int i=list0.key/2,m=1;i>0;-i,+m) HeapAdjustlittle(list,i,list0.key); printf("經(jīng)過(guò)%d次調(diào)整的堆序列為:",m); for(int j=1;j<=list0.key;j+) printf("%d ",listj.key); printf("

20、;相應(yīng)的堆形為:n"); PRINTF1( list); printf("nn"); for(i=list0.key;i>1;-i) p = list1;list1 = listi;listi = p;HeapAdjustlittle(list,1,i-1);/輸出堆void PRINTF1(Heap* list) int h=0,sum=0,item=1; int cnt=1,tmp=1; while(sum<=list0.key) sum+=item; h+; item*=2; printf("-n"); printf(&quo

21、t;堆排序堆型如下n"); while(1) for(int i=0;i<h;i+) for(int j=0;j<h-i;j+) printf(" "); for(j=0;j<tmp;j+) if(cnt>list0.key)goto end; printf("%5d",listcnt+); printf("n");tmp*=2; end: printf("n"); /輸出最后排好的堆序列void PRINTF2(Heap* list) printf("IN THE EN

22、D 最終經(jīng)過(guò)堆排序后的序列為:"); for(int i=1;i<=list0.key;i+) printf("%d ",listi.key); printf("n");/主函數(shù)void main() Heap tmp; desktop(); Heap list15; SCANF(list); printf("-n"); printf("請(qǐng)注意! ! !現(xiàn)在是大頂堆的升序排序.n"); printf("-nnn"); HeapSortbig(list); printf("

23、;-現(xiàn)在按照步驟來(lái)輸出已經(jīng)排好的序列-nnn"); for(int i=1;i<=list0.key ;i+) printf("經(jīng)過(guò)第%d步調(diào)整,現(xiàn)在的已排序列是:",i); for(int j=1;j<i+1;j+) printf("%d ",listj.key ); printf("nn"); printf("nn"); PRINTF2(list); printf("-n"); printf("請(qǐng)注意! ! !現(xiàn)在是小頂堆的降序排序.n"); pri

24、ntf("-nnn"); HeapSortlittle(list); printf("-現(xiàn)在按照步驟來(lái)輸出已經(jīng)排好的序列-nnn"); for( i=1;i<=list0.key ;i+) printf("經(jīng)過(guò)第%d步調(diào)整,現(xiàn)在的已排序列是:",i); for(int j=1;j<i+1;j+)printf("%d ",listj.key ); printf("nn"); printf("nn"); PRINTF2(list);5.程序運(yùn)行測(cè)試與結(jié)果分析 5.1函

25、數(shù)功能檢驗(yàn)與各步運(yùn)行結(jié)果說(shuō)明(圖) 5.1.1 輸入你要排列的數(shù)列5.1.2 輸入數(shù)列的大頂堆建立與調(diào)整5.1.3 大頂堆的分布排序結(jié)果 5.1.4 大頂堆的升序排序的最終結(jié)果 5.1.5輸入序列堆排序與調(diào)整5.1.6 小頂堆的分布排序結(jié)果 5.1.7 小頂堆的升序排序的最終結(jié)果 5.2出錯(cuò)情況的分析 情況一:輸入的數(shù)列中元素個(gè)數(shù)超過(guò)初始上限 解決方法: 情況二:在輸入數(shù)據(jù)時(shí),不小心輸入了不可排序的字符 解決方法:5.3時(shí)間復(fù)雜度與空間復(fù)雜度分析 堆排序是選擇排序中的一種,它只需要一個(gè)記錄大小的輔助空間,每個(gè)待排序的記錄僅占有一個(gè)存儲(chǔ)空間。堆排序方法對(duì)記錄較少的文件不值得提倡,但對(duì)于較大的文件是很有效的。堆排序在最壞的情況下,其時(shí)間復(fù)雜度也為O(nlogn)。相對(duì)于快速排序來(lái)說(shuō),這是最大的優(yōu)點(diǎn)。6 總結(jié)學(xué)期初的課程設(shè)計(jì)實(shí)踐讓我把以

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論