數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法比較_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告</p><p><b>  班級(jí):</b></p><p><b>  學(xué)號(hào):</b></p><p><b>  姓名:</b></p><p><b>  指導(dǎo)老師:</b></p><

2、;p><b>  目 錄</b></p><p><b>  排序算法比較</b></p><p><b>  需求分析</b></p><p><b>  程序的主要功能</b></p><p><b>  程序運(yùn)行平臺(tái)</b>

3、;</p><p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p><b>  算法及時(shí)間復(fù)雜度</b></p><p><b>  測(cè)試用例</b></p><p><b>  程序源代碼</b></p><p><b>

4、  二 感想體會(huì)與總結(jié)</b></p><p><b>  排序算法比較</b></p><p><b>  一、需求分析</b></p><p>  利用隨機(jī)函數(shù)產(chǎn)生N個(gè)隨機(jī)整數(shù)(N = 500,1000,1500,2000,2500,…,30000),利用直接插入排序、折半插入排序,起泡排序、快速排序、選擇

5、排序、堆排序,基數(shù)排序七種排序方法(可添加其它排序方法)進(jìn)行排序(結(jié)果為由小到大的順序),并統(tǒng)計(jì)每一種排序所耗費(fèi)的時(shí)間(統(tǒng)計(jì)為圖表坐標(biāo)形式)。</p><p><b>  二、程序的主要功能</b></p><p>  1.用戶輸入任意個(gè)數(shù),產(chǎn)生相應(yīng)的隨機(jī)數(shù)</p><p>  2.用戶可以自己選擇排序方式(直接插入排序、折半插入排序、起泡排序

6、、快速排序、選擇排序、堆排序、基數(shù)排序)的一種</p><p>  3.程序給出原始數(shù)據(jù)、排序后從小到大的數(shù)據(jù),并給出排序所用的時(shí)間。</p><p><b>  三、程序運(yùn)行平臺(tái)</b></p><p>  Visual C++ 6.0版本</p><p><b>  四、數(shù)據(jù)結(jié)構(gòu)</b><

7、;/p><p>  本程序的數(shù)據(jù)結(jié)構(gòu)為線形表,線性順序表、線性鏈表。</p><p><b>  。</b></p><p><b>  1、結(jié)構(gòu)體: </b></p><p>  typedef struct</p><p><b>  {</b><

8、/p><p>  int *r; //r指向線形表的第一個(gè)結(jié)點(diǎn)。 r[0]閑置,不同的算法有不同的用處,如用作哨兵等。</p><p>  int length; //順序表的總長度</p><p><b>  }Sqlist;</b></p><p><b>  2、空線性表</b></

9、p><p>  Status InitSqlist(Sqlist &L)</p><p><b>  {</b></p><p>  L.r=(int *)malloc(MAXSIZE*sizeof(int)); //分配存儲(chǔ)空間</p><p>  if(!L.r)

10、 </p><p><b>  {</b></p><p>  printf("存儲(chǔ)分配失?。?quot;);</p><p><b>  exit(0);</b></p><p>  } //存儲(chǔ)

11、分配失敗</p><p>  L.length=0;//初始長度為0</p><p>  return OK;</p><p><b>  }</b></p><p>  五、算法及時(shí)間復(fù)雜度</p><p> ?。ㄒ唬└鱾€(gè)排序是算法思想:</p><p> ?。?)直接插

12、入排序:將一個(gè)記錄插入到已排好的有序表中,從而得到一個(gè)新的,記錄數(shù)增加1的有序表。</p><p> ?。?)折半插入排序:插入排序的基本插入是在一個(gè)有序表中進(jìn)行查找和插入,這個(gè)查找可利用折半查找來實(shí)現(xiàn),即為折半插入排序。</p><p>  (3)起泡排序:首先將第一個(gè)記錄的關(guān)鍵字和第二個(gè)記錄的關(guān)鍵字進(jìn)行比較,若為逆序,則將兩個(gè)記錄交換,然后比較第二個(gè)記錄和第三個(gè)記錄的關(guān)鍵字。依此類推,

13、直到第N-1和第N個(gè)記錄的關(guān)鍵字進(jìn)行過比較為止。上述為第一趟排序,其結(jié)果使得關(guān)鍵字的最大紀(jì)錄被安排到最后一個(gè)記錄的位置上。然后進(jìn)行第二趟起泡排序,對(duì)前N-1個(gè)記錄進(jìn)行同樣操作。一共要進(jìn)行N-1趟起泡排序。</p><p> ?。?)快速排序:通過一趟排序?qū)⒋庞涗浄指畛瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,已達(dá)到整個(gè)序列有序。</p>&

14、lt;p> ?。?)選擇排序:通過N-I次關(guān)鍵字間的比較,從N-I+1個(gè)記錄中選出關(guān)鍵字最小的記錄,并和第I(1<=I<=N)個(gè)記錄交換。</p><p>  (6)堆排序:在堆排序的算法中先建一個(gè)大頂堆,既先選得一個(gè)關(guān)鍵字作為最大的記錄并與序列中最后一個(gè)記錄交換,然后對(duì)序列中前N-1記錄進(jìn)行選擇,重新將它調(diào)整成一個(gè)大頂堆,如此反復(fù)直到排序結(jié)束。</p><p>  (7

15、)基數(shù)排序:按最低位優(yōu)先法先對(duì)低位關(guān)鍵字進(jìn)行排序,直到對(duì)最高位關(guān)鍵字排序?yàn)橹梗?jīng)過若干次分配和收集來實(shí)現(xiàn)排序</p><p> ?。ǘr(shí)間復(fù)雜度分析</p><p>  10000個(gè)數(shù)據(jù)的時(shí)間比較:</p><p><b>  六、測(cè)試用例</b></p><p>  1、首先選擇需要排序的數(shù)字個(gè)數(shù),比如輸入5000。

16、</p><p>  2、系統(tǒng)顯示出隨機(jī)產(chǎn)生的隨機(jī)數(shù)。</p><p>  用戶選擇排序方式,比如選擇1.直接插入排序</p><p>  系統(tǒng)將隨機(jī)數(shù)排序后整齊的顯示出來。</p><p>  用戶可以選擇繼續(xù)排序或者退出系統(tǒng)。</p><p><b>  七、程序源代碼</b></p&g

17、t;<p>  /**********************************************************************************************</p><p>  第六題:排序算法比較</p><p>  設(shè)計(jì)要求:利用隨機(jī)函數(shù)產(chǎn)生N個(gè)隨機(jī)整數(shù)(N = 500,1000,1500,2000,2500,…,3000

18、0),</p><p>  利用直接插入排序、折半插入排序,起泡排序、快速排序、||選擇排序、堆排序,基數(shù)排序七種排序方法</p><p> ?。商砑悠渌判蚍椒ǎ┻M(jìn)行排序(結(jié)果為由小到大的順序),并統(tǒng)計(jì)每一種排序所耗費(fèi)的時(shí)間(統(tǒng)計(jì)</p><p><b>  為圖表坐標(biāo)形式)。</b></p><p>  *****

19、*******************************************************************************************/</p><p>  #include "stdio.h"</p><p>  #include "stdlib.h"</p><p>  #i

20、nclude "time.h"//計(jì)時(shí)</p><p>  #define ERROR 0</p><p>  #define OK 1</p><p>  #define OVERFLOW -2</p><p>  #define MAXSIZE 100000 //用戶自己規(guī)定排序的數(shù)字的長度</p>&l

21、t;p>  typedef int Status;</p><p>  typedef struct</p><p><b>  {</b></p><p>  int *r; // r[0]閑置</p><p>  int length; //順序表的總長度</p><p><

22、;b>  }Sqlist;</b></p><p>  //構(gòu)造一個(gè)空線性表</p><p>  Status InitSqlist(Sqlist &L)</p><p><b>  {</b></p><p>  L.r=(int *)malloc(MAXSIZE*siz

23、eof(int)); //分配存儲(chǔ)空間</p><p>  if(!L.r) </p><p><b>  {</b></p><p>  printf("存儲(chǔ)分配失??!");</p><

24、;p><b>  exit(0);</b></p><p>  } //存儲(chǔ)分配失敗</p><p>  L.length=0;//初始長度為0</p><p>  return OK;</p><p><b>  }</b></p><p>  //輸入隨機(jī)數(shù)并顯示在

25、界面上</p><p>  Status ScanfSqlist(int &N,Sqlist &L)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  printf("請(qǐng)輸入要排序的元素個(gè)數(shù)N:

26、");</p><p>  scanf("%d",&N);</p><p>  for(i=1;i<=N;i++)</p><p>  L.r[i]=rand(); //隨機(jī)產(chǎn)生樣本整數(shù)</p><p>  printf("\n\n");</p><p>

27、  printf(" 隨機(jī)產(chǎn)生了%d個(gè)隨機(jī)數(shù),它們是:\n",N);</p><p>  for(i=1;i<=N;i++)</p><p><b>  {</b></p><p>  printf("%7.2d ",L.r[i]);</p><p><b>

28、;  }</b></p><p>  printf("\n");</p><p>  L.length=N; //存儲(chǔ)線性表的長度</p><p>  return OK;</p><p><b>  }</b></p><p>  //輸出排序之后的數(shù)據(jù)</

29、p><p>  Status PrintfSqlist(int N,Sqlist L)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  printf("數(shù)據(jù)個(gè)數(shù):");//輸出數(shù)據(jù)個(gè)數(shù)</p><

30、;p>  printf("%d\n",L.length);</p><p>  printf("排序后的數(shù)據(jù):(從左向右依次增大)\n");//輸出數(shù)據(jù)</p><p>  for(i=1;i<=N;i++)</p><p>  printf("%7.2d ",L.r[i]);</p&

31、gt;<p>  printf("\n");</p><p>  return OK;</p><p><b>  }</b></p><p>  //***************************************************************</p><p

32、>  // 直接插入排序</p><p>  //***************************************************************</p><p>  Status InsertSort(Sqlist &L)//參考書P265算法10.1</p><p>&l

33、t;b>  {</b></p><p><b>  int i,j;</b></p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("要排序的數(shù)據(jù)為空!");</p><

34、p>  return ERROR;</p><p><b>  }</b></p><p>  for(i=2;i<=L.length;i++)</p><p><b>  {</b></p><p>  if(L.r[i]<L.r[i-1]) //將L.r[i]插入有序子表&

35、lt;/p><p><b>  {</b></p><p>  L.r[0]=L.r[i]; //復(fù)制為監(jiān)視哨</p><p>  L.r[i]=L.r[i-1]; </p><p>  for(j=i-2;L.r[0]<L.r[j

36、];j--)</p><p><b>  {</b></p><p>  L.r[j+1]=L.r[j]; //記錄后移</p><p><b>  }</b></p><p>  L.r[j+1]=L.r[0]; //插入到正確位置</p><p><b> 

37、 }</b></p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  //***************************************************************&

38、lt;/p><p>  // 折半插入排序</p><p>  //***************************************************************</p><p>  Status BInsertSort(Sqlist &L) //參考書P267算法10.2

39、</p><p><b>  {</b></p><p>  int i,j,mid,low,high;</p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("要排序的數(shù)據(jù)為空!")

40、;</p><p>  return ERROR;</p><p><b>  }</b></p><p>  for(i=2;i<=L.length;i++)</p><p><b>  {</b></p><p>  L.r[0]=L.r[i]; //將L.r[i

41、]暫存在L.r[0]</p><p><b>  low=1;</b></p><p><b>  high=i-1;</b></p><p>  while(low<=high) //在r[low..high]中折半查找有序插入的位置</p><p><b>  {</b&

42、gt;</p><p>  mid=(low+high)/2;</p><p>  if(L.r[0]<L.r[mid]) //插入點(diǎn)在低半?yún)^(qū) </p><p><b>  {</b></p><p>  high=mid-1;</p><p>&

43、lt;b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p>  low=mid+1; //插入點(diǎn)在高半?yún)^(qū)</p><p><b>  }</b></p><p>&

44、lt;b>  }//while</b></p><p>  for(j=i-1;j>=high+1;j--) //插入點(diǎn)后的數(shù)據(jù)后移</p><p><b>  {</b></p><p>  L.r[j+1]=L.r[j]; </p><p><b> 

45、 }</b></p><p>  L.r[high+1]=L.r[0]; //將數(shù)據(jù)插入</p><p><b>  }//for</b></p><p>  return OK;</p><p><b>  }</b></p><p>  /********

46、************************************************************************</p><p><b>  希爾排序</b></p><p>  *******************************************************************************

47、**/</p><p>  //參考書P272算法10.4及10.5</p><p>  /*Status ShellInsert(Sqlist &L,int dk)//希爾插入排序 </p><p><b>  {</b></p><p>  int i,j;//前后位

48、置的增量是dk</p><p>  for(i=dk+1;i<=L.length;i++)//r[0]只是暫存單元,不是哨兵,</p><p><b>  {</b></p><p>  if(L.r[i]<L.r[i-dk])//將L.r[i]插入有序增量子表</p>

49、<p><b>  {</b></p><p>  L.r[0]=L.r[i];//暫存L.r[0]</p><p>  for(j=i-dk;j>0 && L.r[0]<L.r[j];j-=dk)</p><p><b>  {</b></p>

50、<p>  L.r[j+dk]=L.r[j];//記錄后移,查找插入位置</p><p><b>  }</b></p><p>  L.r[j+dk]=L.r[0];//插入</p><p><b>  }</b></p><p><b

51、>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  Status ShellSort(Sqlist &L,int dlta[5],int t) //希爾排序 </p><p><b>  {</b&

52、gt;</p><p><b>  int i;</b></p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("要排序的數(shù)據(jù)為空!");</p><p>  return ERROR

53、;</p><p><b>  }</b></p><p>  for(i=0;i<t;i++)</p><p><b>  {</b></p><p>  ShellInsert(L,dlta[i]);//一趟增量為dlta[k]的插入排序</p><p&g

54、t;<b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p><b>  */</b></p><p>  //***************************************************

55、***********</p><p>  // 起泡排序</p><p>  //**************************************************************</p><p>  Status BubbleSort(Sqlist &L)</p>

56、;<p><b>  {</b></p><p>  int i,j,t;</p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("要排序的數(shù)據(jù)為空!");</p><p&g

57、t;  return ERROR;</p><p><b>  }</b></p><p>  for(i=1;i<=L.length-1;i++)</p><p><b>  {</b></p><p>  for(j=1;j<=L.length-i;j++)&l

58、t;/p><p><b>  {</b></p><p>  if(L.r[j]>L.r[j+1]) //前面的數(shù)據(jù)>后面數(shù)據(jù)時(shí)</p><p><b>  {</b></p><p>  t=L.r[j+1];</p><p>  L.

59、r[j+1]=L.r[j];</p><p>  L.r[j]=t; //將元素交換</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return OK;<

60、;/p><p><b>  }</b></p><p>  //****************************************************</p><p>  // 快速排序</p><p>  //******************************

61、**********************</p><p>  int Partition(Sqlist &L, int low, int high) //交換順序表中子表L.r[low..high]的記錄,使得樞軸記錄到位,并返回其所在位置,此時(shí)在它之前(后)的記錄均不大于它</p><p><b>  {</b></p><p>

62、  int pivotkey; //記錄關(guān)鍵字</p><p>  L.r[0]=L.r[low]; //用子表的第一個(gè)紀(jì)錄作樞軸紀(jì)錄 </p><p>  pivotkey=L.r[low]; //用樞軸紀(jì)錄關(guān)鍵字 </p><p>  while (low<high)

63、 </p><p><b>  {</b></p><p>  while(low<high && L.r[high]>=pivotkey) </p><p><b>  {</b></p><p><b>

64、  high--;</b></p><p><b>  }</b></p><p>  L.r[low]= L.r[high]; //將比樞軸記錄小的記錄移到低端</p><p>  while(low<high && L.r[low]<=pivotkey) </p><p>&

65、lt;b>  {</b></p><p><b>  low++;</b></p><p><b>  }</b></p><p>  L.r[high]=L.r[low]; //將比樞軸記錄大的數(shù)移到高端</p><p><b>  }</b></p

66、><p>  L.r[low]=L.r[0]; //樞軸記錄到位</p><p>  return low;</p><p>  }//Partition函數(shù)</p><p>  void Qsort (Sqlist &L,int low, int high) </p><p><b>  {</

67、b></p><p>  int pivotloc;</p><p>  if (low<high) //長度大于1,可以進(jìn)行 </p><p><b>  {</b></p><p>  pivotloc=Partition(L, low ,high);<

68、/p><p>  Qsort(L,low,pivotloc-1); //對(duì)低子表遞歸排序,pivotloc是樞軸位置</p><p>  Qsort(L,pivotloc+1,high); //對(duì)高子表遞歸排序</p><p><b>  }</b></p><p>  }//Qsort函數(shù)</p>&l

69、t;p>  Status QuickSort (Sqlist &L) </p><p><b>  {</b></p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("要排序的數(shù)據(jù)為空!");

70、</p><p>  return ERROR;</p><p><b>  }</b></p><p>  Qsort(L,1,L.length);</p><p>  return OK;</p><p>  }//QuickSort</p><p>  //*****

71、*****************************************</p><p>  // 選擇排序</p><p>  //**********************************************</p><p>  Status ChooseSort(Sqlist &L)&l

72、t;/p><p><b>  {</b></p><p>  int i,j,k,t;</p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("沒有數(shù)據(jù)!");</p>&l

73、t;p>  return ERROR;</p><p><b>  }</b></p><p>  for(i=1;i<=L.length;i++) //排序的趟數(shù)</p><p><b>  {</b></p><p><b>  k=i;</b></p&

74、gt;<p>  for(j=i+1;j<=L.length;j++) //比較第i個(gè)元素以及其后的數(shù)據(jù)中最小的 </p><p><b>  {</b></p><p>  if(L.r[j]<L.r[k])</p><p><b>  k=j;</b></p><p>

75、;<b>  }</b></p><p>  if(i!=j) //將最小數(shù)據(jù)賦值給L.r[i]</p><p><b>  {</b></p><p><b>  t=L.r[i];</b></p><p>  L.r[i]=L.r[k];</p><p

76、><b>  L.r[k]=t;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  /

77、/****************************************</p><p>  // 堆排序</p><p>  //****************************************</p><p>  Status HeapAdjust(Sqlist &L,int s,int m)

78、 //調(diào)整L.r[s]的關(guān)鍵字,使L.r[s~m]成大頂堆</p><p><b>  {</b></p><p>  int i;</p><p>  L.r[0]=L.r[s];</p><p>  for(i=2*s;i+1<=m;i*=2) //沿?cái)?shù)據(jù)較大的孩子結(jié)點(diǎn)向下篩選</

79、p><p><b>  {</b></p><p>  if(i<m && L.r[i]<L.r[i+1]) //i為數(shù)據(jù)較大的記錄下標(biāo)</p><p><b>  i++;</b></p><p>  if(L.r[0]>=L.r[i]) //L.r[0]插入在S

80、位置上</p><p><b>  break;</b></p><p>  L.r[s]=L.r[i];</p><p><b>  s=i;</b></p><p><b>  }</b></p><p>  L.r[s]=L.r[0]; //插

81、入新數(shù)據(jù) </p><p>  return OK;</p><p><b>  }</b></p><p>  Status HeapSort(Sqlist &L) //堆排序</p><p><b>  {</b></p><p><b>  int

82、 i,t;</b></p><p>  if(L.length==0)</p><p><b>  {</b></p><p>  printf("沒有數(shù)據(jù)!");</p><p>  return ERROR;</p><p><b>  }</b

83、></p><p>  for(i=L.length/2;i>0;i--)</p><p>  HeapAdjust(L,i,L.length);</p><p>  for(i=L.length;i>1;i--)</p><p><b>  {</b></p><p>  t=

84、L.r[1]; //將堆頂記錄和當(dāng)前未經(jīng)排序的子序列L.r[1..i]中最后一個(gè)記錄互換</p><p>  L.r[1]=L.r[i];</p><p><b>  L.r[i]=t;</b></p><p>  HeapAdjust(L,1,i-1); //將L.r[1..i-1]重新調(diào)整為大頂堆</p><p>

85、;<b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  //**************************************************</p><p>  // 基

86、數(shù)排序</p><p>  //**************************************************</p><p>  typedef struct node{ </p><p>  int key; </p><p>  node *next; </p><p>  }RecTyp

87、e; </p><p>  Status RadixSort(Sqlist L)</p><p><b>  { </b></p><p>  int t,i,j,k,d,n=1,m; </p><p>  RecType *p,*s,*q,*head[10],*tail[10]; //定義各鏈隊(duì)的首尾指針 <

88、;/p><p>  for(i=1;i<=L.length;i++) //將順序表轉(zhuǎn)化為鏈表</p><p><b>  { </b></p><p>  s=(RecType*)malloc(sizeof(RecType)); </p><p>  s->key=L.r[i]; </p><

89、;p>  if(i==1) //當(dāng)為第一個(gè)元素時(shí)</p><p><b>  { </b></p><p><b>  q=s; </b></p><p><b>  p=s; </b></p><p><b>  t++;</b></p&g

90、t;<p><b>  } </b></p><p><b>  else</b></p><p><b>  { </b></p><p>  q->next=s; //將鏈表連接起來</p><p><b>  q=s; </b&g

91、t;</p><p><b>  t++; </b></p><p><b>  } </b></p><p>  q->next=NULL; </p><p><b>  } </b></p><p>  d=1;</

92、p><p>  while(n>0) //將每個(gè)元素分配至各個(gè)鏈隊(duì)</p><p><b>  {</b></p><p>  for(j=0;j<10;j++) //初始化各鏈隊(duì)首、尾指針 </p><p><b>  {</b></p><p>  head

93、[j] = NULL;</p><p>  tail[j] = NULL;</p><p><b>  } </b></p><p>  while(p!=NULL) //對(duì)于原鏈表中的每個(gè)結(jié)點(diǎn)循環(huán) </p><p><b>  { </b></p><p>  k=p-&

94、gt;key/d; </p><p><b>  k=k%10; </b></p><p>  if(head[k]==NULL) //進(jìn)行分配 </p><p><b>  { </b></p><p>  head[k]=p; </p><p>  tail[k]=p;

95、 </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  tail[k]->next=p; </p><p>  tail[k]=p; </p&

96、gt;<p><b>  } </b></p><p>  p=p->next; //取下一個(gè)待排序的元素 </p><p><b>  } </b></p><p>  p=NULL; //用于收集第一個(gè)元素時(shí)的判斷</p><p>  for(j=0;j<10;j+

97、+) //對(duì)每一個(gè)鏈隊(duì)循環(huán), 搜集每一個(gè)元素</p><p><b>  { </b></p><p>  if(head[j]!=NULL) //進(jìn)行搜集 </p><p><b>  { </b></p><p>  if(p==NULL)</p><p>

98、;<b>  { </b></p><p>  p=head[j]; </p><p>  q=tail[j]; </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { <

99、;/b></p><p>  q->next=head[j]; </p><p>  q=tail[j]; </p><p><b>  } </b></p><p><b>  }</b></p><p><b>  } </b></

100、p><p>  q->next=NULL; //最后一個(gè)結(jié)點(diǎn)的next置為空 </p><p><b>  d=d*10; </b></p><p><b>  n=0;</b></p><p><b>  m=1;</b></p><p>  wh

101、ile(m<=L.length) //判斷當(dāng)L中的元素都除d后是不是都為零了</p><p><b>  {</b></p><p>  if((L.r[m]/d)!=0)</p><p><b>  {</b></p><p><b>  n++;</b></p

102、><p><b>  m++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  m++;</b></p><p><b>  }</b>&l

103、t;/p><p><b>  } </b></p><p><b>  i=1; </b></p><p>  while(p!=NULL) //將鏈表轉(zhuǎn)換為順序表</p><p><b>  { </b></p><p>  L.r[i]=p->ke

104、y; </p><p><b>  i++; </b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><

105、;p>  //**************************************</p><p>  // 主函數(shù)</p><p>  //**************************************</p><p>  void main()</p><p><b

106、>  {</b></p><p><b>  Sqlist L;</b></p><p>  Sqlist L0;</p><p>  InitSqlist(L); //初始化L</p><p>  InitSqlist(L0); </p><p>  int m,i;

107、 </p><p>  char choice='z';</p><p>  clock_t start, finish; //定義clock_t用于計(jì)時(shí)</p><p>  double duration; </p><p><b>  //向L中輸入元素</b></p>&l

108、t;p>  printf("\n █████████████████████████████████████\n");</p><p>  printf(" \n");</p><p>

109、  printf(" 算法排序比較系統(tǒng) \n");</p><p>  printf(" \n");&l

110、t;/p><p>  printf(" █████████████████████████████████████\n");</p><p>  printf(" 以下是各個(gè)排序算法的代號(hào):\n\n");</p><p>  printf(" 1、直接插入排序 \n");</

111、p><p>  printf(" 2、折半插入排序 \n");</p><p>  printf(" 3、起泡排序 \n");</p><p>  printf(" 4、快速排序\n");</p><p>  printf(

112、" 5、選擇排序\n");</p><p>  printf(" 6、堆排序\n");</p><p>  printf(" 7、基數(shù)排序\n"); </p><p>  printf(" 8、退出該系統(tǒng)\n\n");

113、</p><p>  ScanfSqlist(m,L0);</p><p>  printf("\n");</p><p>  printf(" 1、直接插入排序 \n");</p><p>  printf(" 2、折半插入排序 \n"

114、;);</p><p>  printf(" 3、起泡排序 \n");</p><p>  printf(" 4、快速排序\n");</p><p>  printf(" 5、選擇排序\n");</p><p>  printf(

115、" 6、堆排序\n");</p><p>  printf(" 7、基數(shù)排序\n"); </p><p>  printf(" 8、退出該系統(tǒng)\n\n");</p><p>  printf("\n請(qǐng)選擇排序的方式,數(shù)字1-7: &quo

116、t;);</p><p>  scanf("%d",&choice); //選擇排序方式賦值choice,用于后面的函數(shù)選擇</p><p>  while(choice<1||choice>8)</p><p><b>  {</b></p><p>  printf(&quo

117、t;輸入方式有誤。\n請(qǐng)輸入1-7選擇排序方式,或者選擇8退出系統(tǒng)");</p><p>  scanf("%d",&choice);</p><p><b>  }</b></p><p>  while(choice!=8)</p><p><b>  {</b&

118、gt;</p><p>  for(i=1;i<=L0.length;i++)</p><p>  L.r[i]=L0.r[i];</p><p>  L.length=L0.length;</p><p>  switch(choice)</p><p><b>  {</b></p

119、><p>  case 1://直接插入排序</p><p>  start = clock(); </p><p>  InsertSort(L);</p><p>  finish = clock();</p><p><b>  break;</b></p><

120、;p>  case 2://折半插入排序</p><p>  start = clock();</p><p>  BInsertSort(L); </p><p>  finish = clock(); </p><p><b>  break;</b>

121、</p><p>  case 3://起泡排序</p><p>  start = clock();</p><p>  BubbleSort(L);</p><p>  finish = clock(); </p><p><b>  break;</b></p>

122、<p>  case 4://快速排序</p><p>  start = clock();</p><p>  QuickSort(L); </p><p>  finish = clock(); </p><p><b>  break;</b></p>

123、<p>  case 5://選擇排序</p><p>  start = clock();</p><p>  ChooseSort(L);</p><p>  finish = clock(); </p><p><b>  break;</b></p><p> 

124、 case 6://堆排序</p><p>  start = clock();</p><p>  HeapSort(L);</p><p>  finish = clock(); </p><p><b>  break;</b></p><p>  case 7://基數(shù)排

125、序</p><p>  start = clock();</p><p>  RadixSort(L);</p><p>  finish = clock(); </p><p><b>  break;</b></p><p>  case 8://直接退出</p>

126、<p><b>  break;</b></p><p><b>  }</b></p><p>  PrintfSqlist(m,L); //輸出數(shù)據(jù)和L的長度</p><p>  duration = (double)(finish - start) / CLOCKS_PER_SEC; //輸出算術(shù)

127、時(shí)間</p><p>  printf("\n本次排序運(yùn)算所用的時(shí)間是:%lf seconds\n",duration);</p><p>  printf(" 本次排序結(jié)束。\n");</p><p>  printf(" ___________________________________________

128、________________________\n");</p><p>  printf(" 繼續(xù)本系統(tǒng)嗎?\n\n");</p><p>  printf(" 以下是各個(gè)排序算法的代號(hào):\n");</p><p>  printf(" 1、直接插入排序\n");</

129、p><p>  printf(" 2、折半插入排序\n");</p><p>  printf(" 3、起泡排序\n");</p><p>  printf(" 4、快速排序\n");</p><p>  printf(" 5、選

130、擇排序\n");</p><p>  printf(" 6、堆排序\n");</p><p>  printf(" 7、基數(shù)排序\n"); </p><p>  printf(" 8、退出該系統(tǒng)\n");</p><p

131、>  printf("\n請(qǐng)請(qǐng)輸入1-7選擇排序方式,或者選擇8退出系統(tǒng):");</p><p>  scanf("%d",&choice);</p><p>  while(choice<1||choice>8)</p><p><b>  {</b></p>&

132、lt;p>  printf("輸入方式有誤。\n請(qǐng)輸入1-7選擇排序方式,或者選擇8退出系統(tǒng)");</p><p>  scanf("%d",&choice);</p><p><b>  }</b></p><p><b>  }</b></p><

133、;p><b>  }</b></p><p><b>  感想體會(huì)與總結(jié)</b></p><p>  好的算法+編程技巧+高效率=好的程序。</p><p>  做什么都需要耐心,做設(shè)計(jì)寫程序更需要耐心。一開始的時(shí)候,我寫函數(shù)寫的很快,可是等最后調(diào)試的時(shí)候發(fā)現(xiàn)錯(cuò)誤很隱蔽,就很費(fèi)時(shí)間了。后來我先在紙上構(gòu)思出函數(shù)的功能和

134、參數(shù),考慮好接口之后才動(dòng)手編,這樣就比較容易成功了。</p><p>  做任何事情我決定都應(yīng)該有個(gè)總體規(guī)劃。之后的工作按照規(guī)劃逐步展開完成。對(duì)于一個(gè)完整的程序設(shè)計(jì),首先需要總體規(guī)劃寫程序的步驟,分塊寫分函數(shù)寫,然后寫完一部分馬上糾錯(cuò)調(diào)試。而不是像我第一個(gè)程序,一口氣寫完,然后再花幾倍的時(shí)間調(diào)試。一步步來,走好一步再走下一步。寫程序是這樣,做項(xiàng)目是這樣,過我們的生活更是應(yīng)該這樣。</p><p

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論