版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--內(nèi)部排序算法的比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告---排序算法的實(shí)現(xiàn)與比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---排序算法的實(shí)現(xiàn)
- 拓?fù)渑判?算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----內(nèi)部排序算法性能分析
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)排序算法演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--排序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---排序綜合
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--各種內(nèi)部排序性能比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---希爾排序,冒泡排序,快速排序
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)排序算法演示系統(tǒng)58165
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--冒泡排序法
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論