




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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ì)說明書內(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ù)書20132014學(xué)年第一學(xué)期課程設(shè)計(jì)名稱: 數(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ù)說明堆排序是數(shù)據(jù)結(jié)構(gòu)中內(nèi)排序部分的重點(diǎn)知識(shí)。堆分為大頂堆和小頂堆。堆排序的過程主要解決兩個(gè)問題
2、:(1)把無序序列建成一個(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ù)定義:根據(jù)設(shè)計(jì)題目的要求,充分地分析和理解問題,明確問題要求做什么? 2)邏輯設(shè)計(jì):寫出抽象數(shù)據(jù)類型的定義,各個(gè)主要模塊的算法,并畫出模塊之間的調(diào)用關(guān)系圖;3)詳細(xì)設(shè)計(jì):定義相應(yīng)的存儲(chǔ)結(jié)構(gòu)并寫出各函數(shù)的偽碼算法。4)程序編碼:把詳細(xì)設(shè)計(jì)的結(jié)果進(jìn)一步求精為程序設(shè)計(jì)語言程序。5)程序調(diào)試與測(cè)試:采用自底向上,分模塊進(jìn)行,即先調(diào)試低層函數(shù)。6)結(jié)果分析:程序運(yùn)行結(jié)果包括正確的輸入及其輸出結(jié)果和含有
3、錯(cuò)誤的輸入及其輸出結(jié)果。算法的時(shí)間、空間復(fù)雜性分析;7)編寫課程設(shè)計(jì)報(bào)告;3.參考資料指導(dǎo)教師:林勇 教研室負(fù)責(zé)人:曹陽課程設(shè)計(jì)評(píng)閱評(píng)語: 指導(dǎo)教師簽名: 年 月 日摘 要 為了查找方便,通常希望通過排序使表成為按鍵字有序的。本課題利用簡(jiǎn)單排序的堆排序方法,通過建立大根堆,并對(duì)元素進(jìn)行輸出,實(shí)現(xiàn)用戶輸入的一組可以組成堆的數(shù)據(jù)元素進(jìn)行處理,使其按關(guān)鍵字排成一個(gè)有序的序列,從而有效的提高了查找效率。再加上界面友好、操作簡(jiǎn)單,使其更加好用。關(guān)鍵詞:堆 排序 查找 流程控制 目 錄 1.課題描述- 2.需求分析- 2.0算法分析- 2.1 抽象數(shù)據(jù)類型定義- 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é)果的說明(圖)- 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)單選擇排序中的堆排序方法,通過對(duì)用戶輸入的可以組成堆的數(shù)據(jù)元素建立大、小根堆,并將其進(jìn)行排序輸出,使其成為一個(gè)按關(guān)鍵字排序的有序序列,從而有效地提高了查找的效率。開發(fā)工具:vc+6.02 問題分
5、析 2.0算法分析 堆的定義如下:n個(gè)元素的序列k1,k2,.,kn當(dāng)且僅當(dāng)滿足下關(guān)系時(shí),稱堆。 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è)完全二叉樹,則堆的含義表明,完全二叉樹中所有的非終端節(jié)點(diǎn)的值均不小于(或不大于)其左右孩子節(jié) 點(diǎn)的值,由此,若序列k1,k2,.,kn是堆,則堆頂元素必為序列中n個(gè)元素的最大值。 2.1抽象數(shù)據(jù)類型定義 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中存有一組無序數(shù)列 操作結(jié)果:將list中的無序數(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中存有一組無序數(shù)列 操作結(jié)果:將list中的無序數(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)滿足下關(guān)系時(shí),稱堆。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è)完全二叉樹,則堆的含義表明,完全二叉樹中所有的非終端節(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)變化來反映無疑是最好的。因此,就要設(shè)計(jì)良好的流程控制來反映出程序運(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)的完全二叉樹的高度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)過堆排序后的序列為:"); 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");/用順序表來存儲(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;/輸出堆頂元素開始進(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)過%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;/輸出堆頂元素開始進(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)過%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)過堆排序后的序列為:"); 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)在按照步驟來輸出已經(jīng)排好的序列-nnn"); for(int i=1;i<=list0.key ;i+) printf("經(jīng)過第%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)在按照步驟來輸出已經(jīng)排好的序列-nnn"); for( i=1;i<=list0.key ;i+) printf("經(jīng)過第%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é)果說明(圖) 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ù)超過初始上限 解決方法: 情況二:在輸入數(shù)據(jù)時(shí),不小心輸入了不可排序的字符 解決方法:5.3時(shí)間復(fù)雜度與空間復(fù)雜度分析 堆排序是選擇排序中的一種,它只需要一個(gè)記錄大小的輔助空間,每個(gè)待排序的記錄僅占有一個(gè)存儲(chǔ)空間。堆排序方法對(duì)記錄較少的文件不值得提倡,但對(duì)于較大的文件是很有效的。堆排序在最壞的情況下,其時(shí)間復(fù)雜度也為O(nlogn)。相對(duì)于快速排序來說,這是最大的優(yōu)點(diǎn)。6 總結(jié)學(xué)期初的課程設(shè)計(jì)實(shí)踐讓我把以
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年恩施房地產(chǎn)市場(chǎng)調(diào)查報(bào)告
- 2024年中國(guó)醫(yī)用鈦合金器件行業(yè)市場(chǎng)調(diào)查報(bào)告
- 中國(guó)芒鞋行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告(2024-2030)
- 2025年中國(guó)油冷機(jī)市場(chǎng)行情動(dòng)態(tài)分析及發(fā)展前景趨勢(shì)預(yù)測(cè)報(bào)告
- 中國(guó)硬質(zhì)合金擠壓制品行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告(2024-2030)
- 安全生產(chǎn)治本攻堅(jiān)三年行動(dòng)的方案
- 小區(qū)電梯升級(jí)改造方案
- 自動(dòng)化+AI-風(fēng)機(jī)運(yùn)營(yíng)效率提升方案-洞察闡釋
- 森林防火安全知識(shí)培訓(xùn)方案
- 2025年酒石酸鹽項(xiàng)目申請(qǐng)報(bào)告模板
- 2025年廣東省珠海市香洲區(qū)5月中考模擬化學(xué)試題(含答案)
- 2025年江蘇省無錫市惠山區(qū)中考一模英語試題(含答案)
- 【課件】醫(yī)學(xué)研究項(xiàng)目申請(qǐng)書的撰寫-以國(guó)家自然科學(xué)基為例
- 《咖啡的風(fēng)味》課件
- 智能太陽能路燈行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2024年云南省嵩明縣事業(yè)單位公開招聘教師崗筆試題帶答案
- 2025年安全生產(chǎn)月主題培訓(xùn)課件:如何查找身邊安全隱患
- 一年級(jí)部編版數(shù)學(xué)下學(xué)期期末復(fù)習(xí)考前練習(xí)單
- 植發(fā)手術(shù)協(xié)議合同
- 銷售項(xiàng)目管理制度模板
- 申請(qǐng)發(fā)票額度合同(2025年版)
評(píng)論
0/150
提交評(píng)論