數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--排序算法演示系統(tǒng)_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論