

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 計算機學(xué)院</b></p><p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p> 題 目:數(shù)據(jù)結(jié)構(gòu)排序算法演示系統(tǒng) </p><p> 班 級: </p><p> 姓 名:
2、 </p><p> 學(xué) 號: </p><p> 同組人姓名: </p><p> 起 迄 日 期: </p><p> 課程設(shè)計地點: <
3、/p><p> 指導(dǎo)教師: </p><p><b> 目錄</b></p><p> 一、課程設(shè)計的目的1</p><p> 二、設(shè)計內(nèi)容和要求1</p><p> 三、數(shù)據(jù)采取的結(jié)構(gòu)1</p><p> 四、功能模塊詳細(xì)
4、設(shè)計1</p><p> 4.1 詳細(xì)設(shè)計思想2</p><p> 4.1.1 冒泡排序5</p><p> 4.1.2 快速排序7</p><p> 4.1.3 直接插入排序9</p><p> 4.1.4 希爾排序10</p><p> 4.1.5 直接選擇排序12
5、</p><p> 4.1.6 堆排序14</p><p> 4.1.7歸并排序17</p><p> 五、總結(jié)或心得體會19</p><p><b> 六、參考文獻20</b></p><p><b> 七、附錄20</b></p><
6、;p><b> 一. 設(shè)計目的</b></p><p> 隨著計算機技術(shù)的發(fā)展,各種排序算法不斷的被提出。排序算法在計算機科學(xué)中有非常重要的意義,且應(yīng)用很廣泛。在以后的發(fā)展中排序?qū)ξ覀兊膶W(xué)習(xí)和生活的影響會逐漸增大,很有必要學(xué)習(xí)排序知識。此次課程設(shè)計一方面使自己掌握排序的知識,另一方面鍛煉一下團隊合作開發(fā)系統(tǒng)的能力。</p><p> 二. 設(shè)計內(nèi)容和要求
7、</p><p><b> 功能要求:</b></p><p> (1)界面友好,易與操作??刹捎貌藛位蚱渌藱C對話方式進行選擇。</p><p> (2)實現(xiàn)各種內(nèi)部排序。包括直接插入排序,冒泡排序,直接選擇排序,希爾排序,快速排序,堆排序,歸并排序。</p><p> (3)待排序的元素的關(guān)鍵字為整數(shù)或(字符
8、)??捎秒S機數(shù)據(jù)和用戶輸入數(shù)據(jù)作測試比較。比較的指標(biāo)為有關(guān)鍵字參加的比較次數(shù)和關(guān)鍵字的移動次數(shù)(關(guān)鍵字交換以3次計)。</p><p> 演示程序以人機對話的形式進行。每次測試完畢顯示各種比較指標(biāo)值的列表,以便比較各種排序的優(yōu)劣。</p><p> 三. 本設(shè)計所采用的數(shù)據(jù)結(jié)構(gòu)</p><p> typedef struct</p><p&
9、gt;<b> {</b></p><p><b> int key;</b></p><p><b> }RecType;</b></p><p><b> 功能模塊詳細(xì)設(shè)計</b></p><p> 4.1 詳細(xì)設(shè)計思想</p>
10、<p><b> 主函數(shù):</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include <math.h></p><p> #define L 8 /
11、/排序元素個數(shù)</p><p> #define FALSE 0</p><p> #define TRUE 1</p><p> typedef struct</p><p><b> {</b></p><p><b> int key;</b></p&g
12、t;<p><b> }RecType;</b></p><p> RecType R[L];</p><p><b> int num; </b></p><p><b> int sum;</b></p><p> int sun;
13、 //定義排序趟數(shù)的全局變量 </p><p><b> //系統(tǒng)主界面</b></p><p><b> //主函數(shù)</b></p><p> int main()</p><p><b> {</b></p><p> RecType
14、 S[100]; </p><p><b> int i,k;</b></p><p> char ch1,ch2,q;</p><p> printf("\n\t\t***********排序算法演示系統(tǒng)************\n\n\t\t請輸入%d個待排序的數(shù)據(jù):\n",L);</p><
15、;p> for(i=1;i<=L;i++)</p><p><b> {</b></p><p> printf("\t\t請輸入第%dth數(shù)據(jù):",i);</p><p> scanf("%d",&S[i].key);</p><p> getcha
16、r();</p><p><b> }</b></p><p><b> ch1='y';</b></p><p> while(ch1=='y')</p><p><b> { </b></p><p> p
17、rintf("\n\t\t 菜 單 \n");</p><p> printf("\n\t\t***********************************************\n");</p><p> printf("\n\t\t * 1----
18、----更新排序數(shù)據(jù)* 2--------直接插入排序 \n");</p><p> printf("\n\t\t * 3--------希 爾 排 序* 4--------冒 泡 排 序 \n");</p><p> printf("\n\t\t * 5--------快 速 排 序* 6--------直接選擇排序
19、 \n");</p><p> printf("\n\t\t * 7--------堆 排 序 * 8--------歸 并 排 序 \n");</p><p> printf("\n\t\t **********0--------退 出************ \n");</p><
20、p> printf("\n\t\t********************************************\n");</p><p> printf("\n\t\t請選擇:");</p><p> scanf("%c",&ch2);</p><p> getchar()
21、;</p><p> for(i=1;i<=L;i++)</p><p><b> {</b></p><p> R[i].key=S[i].key;</p><p><b> }</b></p><p> switch(ch2)</p><
22、;p><b> {</b></p><p><b> case '1':</b></p><p> printf("\n\t\t請輸入%d個待排序數(shù)據(jù)\n\t\t",L);</p><p> for(i=1;i<=L;i++)</p><p>
23、<b> {</b></p><p> scanf("%d",&S[i].key);</p><p> getchar();</p><p> printf("\t\t");</p><p><b> }</b></p><
24、;p> printf("\n\t\t數(shù)據(jù)輸入完畢!");</p><p><b> break;</b></p><p><b> case '2':</b></p><p> Insertsort();</p><p><b> bre
25、ak;</b></p><p><b> case '3':</b></p><p> Shellsort();</p><p><b> break;</b></p><p><b> case '4':</b></p
26、><p> Bubblesort();</p><p><b> break;</b></p><p><b> case '5':</b></p><p> printf("\n\t\t原始數(shù)據(jù)為(按回車鍵開始排序):\n\t\t");</p>
27、<p> for(k=1;k<=L;k++)</p><p><b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }</b></p><p> getchar();</p>&
28、lt;p> printf("\n");</p><p> num=0;sun=0;sum=0;</p><p> Quicksort(1,L);</p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");</p><p> for(k=1;k<=L;k++)&
29、lt;/p><p><b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }</b></p><p> printf("\n\t\t比較次數(shù)是:%d\n\t\t",sum);</p>
30、<p> printf("\n\t\t交換次數(shù)是:%d\n\t\t",sun);</p><p><b> break;</b></p><p><b> case '6':</b></p><p> Selectsort();</p><p>
31、;<b> break;</b></p><p><b> case '7':</b></p><p><b> Heap();</b></p><p><b> break;</b></p><p><b> case
32、 '8':</b></p><p> Mergesort();</p><p><b> break;</b></p><p><b> case '0':</b></p><p><b> ch1='n';</b&
33、gt;</p><p><b> break;</b></p><p><b> default:</b></p><p> system("cls");//清屏</p><p> printf("\n\t\t對不起,您輸入有誤,請重新輸入!\n");
34、</p><p><b> break;</b></p><p><b> }</b></p><p> if(ch2!='0')</p><p><b> {</b></p><p> if(ch2=='2'|
35、|ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8')</p><p><b> {</b></p><p> printf("\n\n\t\t排序完畢!");</p>
36、<p> printf("\n\t\t按回車鍵繼續(xù)!");</p><p> q=getchar();</p><p> if(q!='\n')</p><p><b> {</b></p><p> getchar();</p><p>&
37、lt;b> ch1='n';</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
38、<p><b> return 1;</b></p><p><b> }</b></p><p><b> 圖一 主界面</b></p><p> 4.1.1 冒泡排序</p><p><b> 核心思想</b></p>
39、<p> 依次比較相鄰的兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面,第一輪比較后,最大的數(shù)便被放到了最后;第二輪操作前n-1個數(shù)據(jù)(假設(shè)有n個數(shù)據(jù)),依然是依次比較相鄰的兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面,倒數(shù)第二個數(shù)便是第二大的數(shù);同理第i輪操作前n-i+1的數(shù)據(jù)(假設(shè)i取值是從1開始的),則n-i+i位置上的數(shù)據(jù)為第i大的數(shù)據(jù)。一共有n-1輪,第i輪比較中共比較n-i次比較。</p><p>&l
40、t;b> 核心代碼</b></p><p> void Bubblesort()</p><p><b> {</b></p><p> int i,j,k,x=0,y=0,m=0;</p><p> int exchange=TRUE;//標(biāo)志位exchange初始化為TRUE 1</
41、p><p> printf("\n\t\t原始數(shù)據(jù)為(按回車鍵開始排序):\n\t\t");</p><p> for(k=1;k<=L;k++)</p><p><b> {</b></p><p> printf("%5d",R[k].key);</p>
42、<p><b> }</b></p><p> getchar();</p><p> printf("\n");</p><p> for(i=1;i<L&&exchange==TRUE;i++)//外層對總的循環(huán)次數(shù)執(zhí)行次數(shù)</p><p><b&g
43、t; {</b></p><p> exchange=FALSE;</p><p> for(j=1;j<=L+1-i;j++) //內(nèi)層相鄰記錄的交換與比較</p><p> { m++;//比較次數(shù)++</p><p> if(R[j].key<R[j-1].key)</p><p&g
44、t;<b> {</b></p><p> R[0].key=R[j].key;</p><p> R[j].key=R[j-1].key;</p><p> R[j-1].key=R[0].key;</p><p> exchange=TRUE;</p><p> y++;//移動次
45、數(shù)++</p><p><b> }</b></p><p><b> }</b></p><p> m--;//比較次數(shù)</p><p> if(exchange) //輸出語句</p><p><b> {</b&
46、gt;</p><p> printf("\t\t第%d趟冒泡排序的結(jié)果為:\n\t\t",i);</p><p> for(k=1;k<=L;k++)</p><p> { printf("%5d",R[k].key);</p><p><b> }</b><
47、;/p><p> getchar();</p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n\t\t比較次數(shù)是:\t\t"
48、);</p><p> printf("%d",m);</p><p> printf("\n\t\t移動次數(shù)是:\t\t");</p><p> printf("%d",y);</p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t"
49、);</p><p> for(i=1;i<=L;i++)</p><p> { printf("%5d",R[i].key);</p><p><b> }</b></p><p><b> }</b></p><p><b>
50、 圖二 直接插入排序</b></p><p> 4.1.2 快速排序</p><p><b> 核心思想</b></p><p> 首先檢查數(shù)據(jù)列表中的數(shù)據(jù)數(shù),如果小于兩個,則直接退出程序。如果有超過兩個以上的數(shù)據(jù),就選擇一個分割點將數(shù)據(jù)分成兩個部分,小于分割點的數(shù)據(jù)放在一組,其余的放在另一組,然后分別對兩組數(shù)據(jù)排序。 通
51、常分割點的數(shù)據(jù)是隨機選取的。這樣無論你的數(shù)據(jù)是否已被排列過,你所分割成的兩個字列表的大小是差不多的。而只要兩個子列表的大小差不多</p><p><b> 核心代碼</b></p><p><b> //遞歸算法實現(xiàn)</b></p><p> void Quicksort(int low,int high)</
52、p><p><b> { </b></p><p> int i=low,j=high,k;</p><p> R[0].key=R[low].key;</p><p> while(i<j)</p><p><b> {</b></p><p
53、> while(i<j&&R[0].key<=R[j].key) //右側(cè)掃描</p><p><b> {j--;</b></p><p><b> sum++;</b></p><p><b> }</b></p><p><
54、;b> if(i<j)</b></p><p> { R[i].key=R[j].key;//交換</p><p><b> i++;</b></p><p><b> sun++;</b></p><p><b> }</b></p&
55、gt;<p> while(i<j&&R[i].key<R[0].key)//左側(cè)掃描 </p><p><b> {i++;</b></p><p><b> sum++;</b></p><p><b> }</b></p><
56、p><b> if(i<j)</b></p><p><b> {</b></p><p> R[j].key=R[i].key;//交換</p><p><b> j--;</b></p><p><b> sun++;</b>&l
57、t;/p><p><b> }</b></p><p><b> }</b></p><p> R[i].key=R[0].key;</p><p><b> num++;</b></p><p> //輸出語句包括排序的結(jié)果及次數(shù) </p&
58、gt;<p> printf("\t\t第%d趟快速排序的結(jié)果為:\n\t\t",num);</p><p> for(k=1;k<=L;k++)</p><p> { printf("%5d",R[k].key);</p><p><b> }</b></p>
59、<p> getchar();</p><p> printf("\n");</p><p> if(low<i-1) Quicksort(low,i-1);//遞歸部分(左側(cè))</p><p> if(j+1<high) Quicksort(j+1,high);//遞歸部分(右側(cè))</p><
60、;p><b> }</b></p><p><b> 圖三 快速排序</b></p><p> 4.1.3 直接插入排序</p><p><b> 核心思想</b></p><p> 經(jīng)過i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L
61、[1..i-1]的適當(dāng)位置,使得L[1..i]又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較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]時為止</p><p><b> 核心代碼<
62、;/b></p><p> void Insertsort()</p><p><b> {</b></p><p> int i,j,k,m=0,x=0; //初始化比較次數(shù)變量m,移動次數(shù)變量x</p><p> printf("\n\t\t原始數(shù)據(jù)為:(按回車鍵開始排序)\n\t\t&qu
63、ot;);</p><p> for(k=1;k<=L;k++)</p><p><b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }</b></p><p> getchar
64、();</p><p> printf("\n");</p><p><b> //主要運行部分</b></p><p> for(i=2;i<=L;i++)</p><p><b> {</b></p><p> if(R[i].key&
65、lt;R[i-1].key)</p><p><b> {</b></p><p> R[0]=R[i];</p><p><b> j=i-1;</b></p><p> while(R[0].key<R[j].key)</p><p><b>
66、{</b></p><p> R[j+1]=R[j];</p><p><b> j--;</b></p><p><b> }</b></p><p> R[j+1]=R[0];</p><p><b> x++;</b><
67、/p><p><b> }</b></p><p><b> m++;</b></p><p> //輸出語句包括排序的結(jié)果及次數(shù) </p><p> printf("\t\t第%d趟直接插入排序的結(jié)果為:\n\t\t",m);</p><p> f
68、or(k=1;k<=L;k++)</p><p> { printf("%5d",R[k].key);</p><p><b> }</b></p><p> getchar();</p><p> printf("\n");</p><p>
69、;<b> }</b></p><p> printf("\n");</p><p> printf("\n\t\t比較次數(shù)是:\t\t");</p><p> printf("%d",m);</p><p> printf("\n\t\t移
70、動次數(shù)是:\t\t");</p><p> printf("%d",x);</p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");</p><p> for(i=1;i<=L;i++)</p><p> { printf("%5d"
71、,R[i].key);</p><p><b> }</b></p><p><b> }</b></p><p><b> 圖四 直接插入排序</b></p><p> 4.1.4 希爾排序</p><p><b> 核心思想&l
72、t;/b></p><p> 先取一個小于n的整數(shù)d1作為第一個增量,把文件的全部記錄分成d1個組。所有距離為dl的倍數(shù)的記錄放在同一個組中。先在各組內(nèi)進行直接插入排序;然后,取第二個增量d2<d1重復(fù)上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。</p><p><b&g
73、t; 核心代碼</b></p><p> void Shellsort()</p><p><b> {</b></p><p> int i,j,gap,x,k,y=0,m=0; //初始化比較次數(shù)變量m,移動次數(shù)變量y</p><p> printf("\n\t\t原始數(shù)據(jù)為:(按
74、回車鍵開始排序)\n\t\t");</p><p> for(k=1;k<=L;k++)</p><p><b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }</b></p>&
75、lt;p> getchar();</p><p> printf("\n");</p><p><b> //函數(shù)主要部分</b></p><p><b> gap=L/2;</b></p><p> while(gap>0)</p><
76、p><b> {</b></p><p> for(i=gap+1;i<=L;i++)</p><p><b> {</b></p><p><b> j=i-gap;</b></p><p> while(j>0)</p><p
77、><b> {</b></p><p> if(R[j].key>R[j+gap].key)</p><p><b> {</b></p><p> x=R[j].key;//交換語句</p><p> R[j].key=R[j+gap].key;</p><
78、;p> R[j+gap].key=x;</p><p><b> j=j-gap;</b></p><p> y++;//移動次數(shù)++</p><p><b> }</b></p><p><b> else</b></p><p>&l
79、t;b> {</b></p><p><b> j=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> ga
80、p=gap/2;</p><p> m++;//比較次數(shù)++</p><p> //輸出語句包括排序的結(jié)果及次數(shù) </p><p> printf("\t\t第%d趟希爾排序的結(jié)果為:\n\t\t",m);</p><p> for(k=1;k<=L;k++)</p><p><
81、b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }</b></p><p> getchar();</p><p> printf("\n");</p><p><
82、;b> }</b></p><p> printf("\n\t\t比較次數(shù)是:\t\t");</p><p> printf("%d",m);</p><p> printf("\n\t\t移動次數(shù)是:\t\t");</p><p> printf(&qu
83、ot;%d",y);</p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");</p><p> for(i=1;i<=L;i++)</p><p><b> {</b></p><p> printf("%5d",R[i].key)
84、;</p><p><b> }</b></p><p> printf("\n");</p><p><b> } </b></p><p><b> 圖五 希爾排序</b></p><p> 4.1.5 直接選擇排序&
85、lt;/p><p><b> 核心思想</b></p><p> 第一次從R[0]~R[n-1]中選取最小值,與R[0]交換,第二次從R{1}~R[n-1]中選取最小值,與R[2]交換,...., 第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得
86、到一個按排序碼從小到大排列的有序序列.</p><p><b> 核心代碼</b></p><p> void Selectsort()</p><p><b> {</b></p><p> int i,j,k,h,x=0,y=0;</p><p> printf
87、("\n\t\t原始數(shù)據(jù)為(按回車鍵開始排序):\n\t\t");</p><p> for(k=1;k<=L;k++)</p><p><b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }&l
88、t;/b></p><p> getchar();</p><p> printf("\n");</p><p> for(i=1;i<L;i++)</p><p><b> {</b></p><p><b> h=i;</b>&l
89、t;/p><p> for(j=i+1;j<=L;j++)</p><p> {x++; //比較次數(shù)</p><p> if(R[j].key<R[h].key)</p><p><b> {</b></p><p> h=j;
90、 //確定最小值</p><p><b> }</b></p><p><b> }</b></p><p><b> if(h!=i)</b></p><p><b> {</b></p>&
91、lt;p> R[0].key=R[i].key;</p><p> R[i].key=R[h].key;</p><p> R[h].key=R[0].key;</p><p> y++; //移動次數(shù)</p><p><b> }</b></p>
92、<p> printf("\t\t第%d趟選擇排序的結(jié)果為:\n\t\t",i);</p><p> for(k=1;k<=L;k++)</p><p> printf("%5d",R[k].key);</p><p> getchar();</p><p> printf(
93、"\n");</p><p><b> }</b></p><p> //輸出語句包括排序的結(jié)果及次數(shù) </p><p> printf("\n\t\t比較次數(shù):%d",x);</p><p> printf("\n\t\t移動次數(shù):%d",y);<
94、;/p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");</p><p> for(i=1;i<=L;i++)</p><p> printf("%5d",R[i].key);</p><p> printf("\n");</p>&l
95、t;p><b> }</b></p><p><b> 圖六 選擇排序</b></p><p> 4.1.6 堆排序</p><p><b> 核心思想</b></p><p> 堆排序是一樹形選擇排序,在排序過程中,將R[1..N]看成是一顆完全二叉樹的順序
96、存儲結(jié)構(gòu),利用完全二叉樹中雙親結(jié)點和孩子結(jié)點之間的內(nèi)在關(guān)系來選擇最小的元素。將原始記錄序列建成一個堆,成為初始堆,并輸出堆頂元素;調(diào)整剩余的記錄序列,使之成為一個新堆,再輸出堆頂元素;如此反復(fù)進行,當(dāng)堆中只有一個元素時,整個序列的排序結(jié)束,輸出的序列便是原始序列的非遞減有序序列。在堆排序的過程中,主要負(fù)責(zé)兩方面的工作:一是如何將原始記錄序列構(gòu)造成一個堆,即建立初始堆;二是輸出堆頂元素后,如何將剩余記錄整理成一個新堆。</p>
97、<p><b> 核心代碼</b></p><p> void CreateHeap(int root,int index,int *x,int *y)</p><p><b> {</b></p><p> int j,temp,finish;</p><p> j=2*r
98、oot; //j指向左孩子</p><p> temp=R[root].key;</p><p><b> finish=0;</b></p><p> while(j<=index&&finish==0)</p><p><b>
99、; {</b></p><p> if(j<index)</p><p><b> {</b></p><p> if(R[j].key<R[j+1].key)</p><p><b> {</b></p><p><b> j+
100、+;</b></p><p><b> }</b></p><p> } //指向較大的孩子</p><p> if(temp>=R[j].key)</p><p><b> {</b></p>
101、<p><b> finish=1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> R[j/2].key=R[j].key;<
102、/p><p><b> (*y)++;</b></p><p><b> j=j*2;</b></p><p><b> }</b></p><p> *x = *x+2;</p><p><b> }</b></p&g
103、t;<p> R[j/2].key=temp;</p><p><b> (*y)++;</b></p><p><b> }</b></p><p><b> //堆排序</b></p><p> void Heapsort()</p>
104、<p><b> {</b></p><p> int i,j,temp,k,x=0,y=0;</p><p> for(i=(L/2);i>=1;i--) //建立初始堆</p><p><b> {</b></p><p> CreateHeap(i,L,&
105、x,&y);</p><p><b> }</b></p><p><b> x=0;</b></p><p><b> y=0;</b></p><p> for(i=L-1,k=1;i>=1;i--,k++) //將堆中根節(jié)點和最后一個節(jié)點交換<
106、;/p><p><b> {</b></p><p> temp=R[i+1].key;</p><p> R[i+1].key=R[1].key;</p><p> R[1].key=temp;</p><p> CreateHeap(1,i,&x,&y);</p&g
107、t;<p> printf("\t\t第%d趟堆排序的結(jié)果為:\n\t\t",k);</p><p> for(j=1;j<=L;j++)</p><p><b> {</b></p><p> printf("%5d",R[j].key);</p><p&
108、gt;<b> }</b></p><p> getchar();</p><p> printf("\n");</p><p><b> }</b></p><p> printf("\n\t\t比較次數(shù)是:%d\t\t",x);</p>
109、;<p> printf("\n\t\t移動次數(shù)是:%d\t\t",y);</p><p><b> }</b></p><p> void Heap()</p><p><b> {</b></p><p><b> int i;</b&
110、gt;</p><p> printf("\n\t\t原始數(shù)據(jù)為(按回車鍵開始排序):\n\t\t");</p><p> for(i=1;i<=L;i++)</p><p><b> {</b></p><p> printf("%5d",R[i].key);<
111、;/p><p><b> }</b></p><p> getchar();</p><p> printf("\n");</p><p> Heapsort();</p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");<
112、;/p><p> for(i=1;i<=L;i++)</p><p><b> {</b></p><p> printf("%5d",R[i].key);</p><p><b> }</b></p><p> printf("\n
113、");</p><p><b> }</b></p><p> void Merge(int low,int mm,int high,int *x,int *y)//兩個有序序列的合并</p><p><b> {</b></p><p> int i=low,j=mm+1,p=0
114、;</p><p> RecType *R1; //i對第一個開始到結(jié)尾,j從第二個開始到結(jié)尾</p><p> R1=new RecType[high-low+1];</p><p><b> if(!R1)</b></p><p><b> {</b></p><
115、p> printf("內(nèi)存不足!");</p><p><b> }</b></p><p> while(i<=mm&&j<=high)//兩序列從起始位置開始將小的元素放入到R1中</p><p><b> {</b></p><p>
116、; R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];</p><p><b> (*x)++;</b></p><p><b> (*y)++;</b></p><p><b> }</b></p><p> while(i
117、<=mm)//第二段結(jié)束,剩余放入R1中</p><p><b> {</b></p><p> R1[p++]=R[i++];</p><p><b> (*y)++;</b></p><p><b> }</b></p><p> w
118、hile(j<=high)//第二段剩余,剩余放入R1中</p><p><b> {</b></p><p> R1[p++]=R[j++];</p><p><b> (*y)++;</b></p><p><b> }</b></p><
119、p> for(p=0,i=low;i<=high;p++,i++)//剩余元素放入R1中,賦予R</p><p><b> {</b></p><p> R[i]=R1[p];</p><p><b> (*y)++;</b></p><p><b> }</b
120、></p><p><b> }</b></p><p><b> 圖七 堆排序</b></p><p> 4.1.7 歸并排序</p><p><b> 核心思想</b></p><p> 將有n個記錄的原始序列看作n個有序子序列,每
121、個子序列的長度為1,然后從第一個子序列開始,把相鄰的子序列兩兩合并,得到[n/2]個長度為2或1的子序列(當(dāng)子序列個數(shù)為奇數(shù)時,最后一組合并得到的序列長度為1),把這一過程稱為一次歸并排序,對第一次歸并排序后的[n/2]個子序列采用上述方法繼續(xù)順序成對歸并,如此重復(fù),當(dāng)最后得到的長度為n的一個子序列時,該子序列便是原始序列歸并排序后的有序序列。</p><p><b> 核心代碼</b>&
122、lt;/p><p> void MergePass(int length,int *x,int *y)//一次二路歸并排序</p><p><b> { int i;</b></p><p> for(i=1;i+2*length-1<=L;i=i+2*length)</p><p> { Merge(i,i
123、+length-1,i+2*length-1,x,y); //函數(shù)調(diào)用</p><p><b> }</b></p><p> if(i+length-1<L)</p><p> { Merge(i,i+length-1,L,x,y); //函數(shù)調(diào)用</p><p><b> }</b&
124、gt;</p><p><b> }</b></p><p><b> //歸并排序</b></p><p> void Mergesort() //二路歸并排序</p><p> { int length,k,m=0,i,x=0,y=0;</p><p> pri
125、ntf("\n\t\t原始數(shù)據(jù)為(按回車鍵開始排序):\n\t\t");</p><p> for(k=1;k<=L;k++)</p><p> { printf("%5d",R[k].key);</p><p><b> }</b></p><p> getcha
126、r();</p><p> printf("\n");</p><p> for(length=1;length<L;length*=2)</p><p> { MergePass(length,&x,&y);</p><p> m++; //輸出語句包括排序的結(jié)果及次數(shù)</p>
127、<p> printf("\t\t第%d趟歸并排序的結(jié)果為:\n\t\t",m);</p><p> for(k=1;k<=L;k++)</p><p> { printf("%5d",R[k].key);</p><p><b> }</b></p><
128、p> getchar();</p><p> printf("\n");</p><p><b> }</b></p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");</p><p> for(i=1;i<=L;i++)</p&
129、gt;<p> { printf("%5d",R[i].key);</p><p><b> }</b></p><p> printf("\n");</p><p> printf("\t\t比較次數(shù):%d\n",x);</p><p>
130、; printf("\t\t移動次數(shù):%d\n",y);</p><p><b> }</b></p><p><b> 圖八 歸并排序</b></p><p><b> 總結(jié)或心得</b></p><p> 回顧這個設(shè)計過程,我學(xué)到了許多書本上沒
131、有學(xué)到的知識。通過這次小組制作的程序,豐富了自己的實踐技能,擴展了本專業(yè)的知識面,使我受益非淺,同時也體驗到了搞軟件開發(fā)的困難度。在這次設(shè)計的同時我又從中學(xué)到了許多東西。但由于我對這樣的排序系統(tǒng)還只是一個開始,了解的不多,這其中或許還有很多的不足,在這里也懇請各位老師能夠?qū)ξ覀兊淖髌分该鞑蛔悴⒓右愿恼?傊?,在這一次的課程設(shè)計過程中,我們查閱了大量的資料,對數(shù)據(jù)結(jié)構(gòu)有了一點初步的認(rèn)識,對于網(wǎng)絡(luò)工程這些輔助性的教材也鞏固了不少,為我們這次
132、的課設(shè)提供了很大的幫助,鍛煉了我們的能力,讓我更加熟練了這門程序設(shè)計語言:C/C++語言,系統(tǒng)地學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)方面的知識,并更進一步提高了我們在程序設(shè)計、調(diào)試方面的技巧。更重要的是,它還讓我們認(rèn)識到了自己的不足,在編程方面,我僅僅是剛剛?cè)腴T而已,以后的道路任重道遠(yuǎn),需要我不斷的豐富自己、充實自己,這樣才能在程序設(shè)計方面有所收獲。在最后也感謝我們的小組成員,我在他的幫忙下順利的做好自己負(fù)責(zé)的部分.</p><p>
133、<b> 六.參考文獻</b></p><p> 嚴(yán)蔚敏,吳偉明,《數(shù)據(jù)結(jié)構(gòu)(C語言版)》,清華大學(xué)出版社,2007年:P263-P288。</p><p><b> 七.附錄</b></p><p> #include<stdio.h></p><p> #include&l
134、t;stdlib.h></p><p> #include <math.h></p><p> #define L 8 //排序元素個數(shù)</p><p> #define FALSE 0</p><p> #define TRUE 1</p><p> typedef s
135、truct</p><p><b> {</b></p><p><b> int key;</b></p><p><b> }RecType;</b></p><p> RecType R[L];</p><p><b> int
136、 num; </b></p><p><b> int sum;</b></p><p> int sun; //定義排序趟數(shù)的全局變量 </p><p><b> //系統(tǒng)主界面</b></p><p> void Bubblesort()</p&
137、gt;<p><b> {</b></p><p> int i,j,k,x=0,y=0,m=0;</p><p> int exchange=TRUE;//標(biāo)志位exchange初始化為TRUE 1</p><p> printf("\n\t\t原始數(shù)據(jù)為(按回車鍵開始排序):\n\t\t");<
138、;/p><p> for(k=1;k<=L;k++)</p><p><b> {</b></p><p> printf("%5d",R[k].key);</p><p><b> }</b></p><p> getchar();</
139、p><p> printf("\n");</p><p> for(i=1;i<L&&exchange==TRUE;i++)//外層對總的循環(huán)次數(shù)執(zhí)行次數(shù)</p><p><b> {</b></p><p> exchange=FALSE;</p><p
140、> for(j=1;j<=L+1-i;j++) //內(nèi)層相鄰記錄的交換與比較</p><p> { m++;//比較次數(shù)++</p><p> if(R[j].key<R[j-1].key)</p><p><b> {</b></p><p> R[0].key=R[j].key;</
141、p><p> R[j].key=R[j-1].key;</p><p> R[j-1].key=R[0].key;</p><p> exchange=TRUE;</p><p> y++;//移動次數(shù)++</p><p><b> }</b></p><p><
142、;b> }</b></p><p> m--;//比較次數(shù)</p><p> if(exchange) //輸出語句</p><p><b> {</b></p><p> printf("\t\t第%d趟冒泡排序的結(jié)果為:\n\t\t",i
143、);</p><p> for(k=1;k<=L;k++)</p><p> { printf("%5d",R[k].key);</p><p><b> }</b></p><p> getchar();</p><p> printf("\n&q
144、uot;);</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n\t\t比較次數(shù)是:\t\t");</p><p> printf("%d",m);</p><p>
145、; printf("\n\t\t移動次數(shù)是:\t\t");</p><p> printf("%d",y);</p><p> printf("\n\t\t排序最終結(jié)果是:\n\t\t");</p><p> for(i=1;i<=L;i++)</p><p> {
146、 printf("%5d",R[i].key);</p><p><b> }</b></p><p><b> }</b></p><p><b> //遞歸算法實現(xiàn)</b></p><p> void Quicksort(int low,int
147、high)</p><p><b> { </b></p><p> int i=low,j=high,k;</p><p> R[0].key=R[low].key;</p><p> while(i<j)</p><p><b> {</b></p&
148、gt;<p> while(i<j&&R[0].key<=R[j].key) //右側(cè)掃描</p><p><b> {j--;</b></p><p><b> sum++;</b></p><p><b> }</b></p>&l
149、t;p><b> if(i<j)</b></p><p> { R[i].key=R[j].key;//交換</p><p><b> i++;</b></p><p><b> sun++;</b></p><p><b> }</b&
150、gt;</p><p> while(i<j&&R[i].key<R[0].key)//左側(cè)掃描 </p><p><b> {i++;</b></p><p><b> sum++;</b></p><p><b> }</b></p
151、><p><b> if(i<j)</b></p><p><b> {</b></p><p> R[j].key=R[i].key;//交換</p><p><b> j--;</b></p><p><b> sun++;&l
152、t;/b></p><p><b> }</b></p><p><b> }</b></p><p> R[i].key=R[0].key;</p><p><b> num++;</b></p><p> //輸出語句包括排序的結(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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計排序算法演示系統(tǒng)
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計排序算法演示系統(tǒng)58165
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--內(nèi)部排序演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--排序算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---數(shù)據(jù)結(jié)構(gòu)相關(guān)算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--- 數(shù)據(jù)結(jié)構(gòu)各章算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---排序算法的實現(xiàn)
- 拓?fù)渑判?算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----內(nèi)部排序算法性能分析
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--內(nèi)部排序算法的比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--排序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---排序綜合
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---希爾排序,冒泡排序,快速排序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--冒泡排序法
評論
0/150
提交評論