版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p> 題目: 內(nèi)部排序算法的比較</p><p><b> 實(shí)驗(yàn)報告</b></p><p><b> 需求分析</b></p><p> 本程序?qū)σ韵铝N常用的內(nèi)部排序進(jìn)行實(shí)測比較:起泡排序、直接插
2、入</p><p> 排序、簡單選擇排序、快速排序、希爾排序、堆排序。</p><p> 2.待排序表的元素的關(guān)鍵字為整數(shù),雍正徐、逆序和隨機(jī)數(shù)產(chǎn)生器產(chǎn)生的隨機(jī)數(shù)做測試比較。比較的指標(biāo)為有關(guān)鍵字參加的比較次數(shù)和關(guān)鍵字的移動次數(shù)(關(guān)鍵字交換記為3次移動)。</p><p> 3.程序以用戶和計算機(jī)的對話方式執(zhí)行,即在計算機(jī)終端上顯示“提示信息”下,用戶可由鍵盤輸
3、入產(chǎn)生隨機(jī)數(shù)的種子,計算機(jī)終端顯示各內(nèi)部排序的比較參數(shù)。</p><p> 4.最終對結(jié)果做出簡單分析,包括對各組數(shù)據(jù)得出結(jié)果波動大小給予解釋。</p><p><b> 二、概要設(shè)計</b></p><p> 1.可排序表的抽象數(shù)據(jù)類型定義:</p><p> ADT OrderableList</p&g
4、t;<p><b> {</b></p><p> 數(shù)據(jù)對象:D = {ai |ai ∈IntegerSet,i = 1,2,……,n,n >= 0}</p><p> 數(shù)據(jù)關(guān)系:R1 = {<ai-1,ai>|ai-1,ai ∈D.i = 2,……,n}</p><p><b> 基本操作:&
5、lt;/b></p><p> SelectListType(c)</p><p> 操作結(jié)果:打印提示信息,請用戶選擇待排序表的類型,順序型、</p><p> 逆序型還是隨機(jī)數(shù)組。</p><p> BubbleSort(&L)</p><p> 操作結(jié)果:進(jìn)行起泡排序,返回排序后的順序表&
6、lt;/p><p> InsertSort(&L)</p><p> 操作結(jié)果:進(jìn)行插入排序,返回排序后的順序表</p><p> SelectSort(&L)</p><p> 操作結(jié)果:進(jìn)行選擇排序,返回排序后的順序表</p><p> QuickSort(&L)</p>
7、<p> 操作結(jié)果:進(jìn)行快速排序,返回排序后的順序表</p><p> ShellSort(&L)</p><p> 操作結(jié)果:進(jìn)行希爾排序,返回排序后的順序表</p><p> HeapSort(&L)</p><p> 操作結(jié)果:進(jìn)行堆排序,返回排序后的順序表</p><p>
8、 SelectSortMethod(&L,c1)</p><p> 操作結(jié)果:打印提示信息,請用戶選擇排序方法,起泡排序、插入</p><p> 排序、選擇排序、快速排序、希爾排序還是堆排序</p><p><b> OutPut(L)</b></p><p> 操作結(jié)果:打印排序中關(guān)鍵字的比較次數(shù)和移
9、動次數(shù)</p><p> }ADT OrderableList</p><p> 本程序包含兩個模塊:</p><p><b> 1).主程序模塊</b></p><p> int mian()</p><p><b> { </b></p><
10、p><b> 初始化;</b></p><p> 用戶選擇待測表的類型;</p><p> 輸入選擇,用switch語句判斷;</p><p> While(“命令” != “退出”)</p><p><b> {</b></p><p><b>
11、 接受命令;</b></p><p><b> 處理命令;</b></p><p><b> }</b></p><p><b> }</b></p><p> ?。玻膳判虮韱卧K----實(shí)現(xiàn)可排序表的抽象數(shù)據(jù)類型</p><p>
12、; 各模塊之間的調(diào)用關(guān)系:</p><p><b> 主程序模塊</b></p><p><b> 可排序表單元模塊</b></p><p><b> 三、詳細(xì)設(shè)計</b></p><p> 1.根據(jù)題目要求何可排序表的基本操作特點(diǎn),可排序表采用證書順序表存儲結(jié)構(gòu),并
13、實(shí)現(xiàn)在頭文件SqList.H。</p><p> //******************基本操作的函數(shù)原型******************\\</p><p> #define MAXSIZE 20 //用作示例的順序表的最大長度</p><p> typedef int KeyType; //定義
14、關(guān)鍵字為整數(shù)類型</p><p> typedef int InfoType; //定義其他數(shù)據(jù)項(xiàng)也為整數(shù)類型</p><p> int time_key_compare = 0; //定義全局變量,關(guān)鍵字比較次</p><p> int time_key_move = 0; //數(shù)和移動次數(shù)均為0
15、</p><p> typedef struct</p><p><b> {</b></p><p> KeyType key; //關(guān)鍵字項(xiàng)</p><p> InfoType otherinfo; //其他數(shù)據(jù)項(xiàng)</p><p
16、> }RedType; //記錄類型</p><p> typedef struct</p><p><b> {</b></p><p> RedType r[MAXSIZE + 1]; //r[0]閑置或用做哨兵</p><p> in
17、t length; //順序表長度</p><p> }SqList; //順序表類型</p><p> //****************************基本操作*********************\\</p><p> bool LT(KeyType
18、 a,KeyType b)//比較兩個KeyType類型變量的大小</p><p><b> {</b></p><p> time_key_compare ++; //比較次數(shù)+1</p><p><b> if(a < b)</b></p><p
19、> return true; //<,返回true</p><p><b> else </b></p><p> return false; //否則,返回false</p><p><b> } //LT</b
20、></p><p> void copyKey(RedType &a,RedType &b)</p><p> { //將RedType類型變量b復(fù)制給a</p><p><b> a = b;</b></p><p> time_
21、key_move ++; //關(guān)鍵字移動次數(shù)+1</p><p> }//copyKey</p><p> void swap(RedType &a,RedType &b)</p><p> { //將RedType型變量a和b進(jìn)行交換操作</p&
22、gt;<p> RedType c; //定義RedType型變量c</p><p><b> c = a;</b></p><p><b> a = b;</b></p><p><b> b = c;</b></p&g
23、t;<p> time_key_move += 3; //關(guān)鍵字移動次數(shù)+3</p><p><b> }//swap</b></p><p> /****************直接插入排序*********************\</p><p> void InsertSo
24、rt(SqList &L)</p><p> { //對順序表L做直接插入排序</p><p> for(int i = 2; i <= L.length; ++i)</p><p><b> {</b></p><p> if(LT(L
25、.r[i].key,L.r[i - 1].key))</p><p> { //“<”,需將L.r[i]插入有序子表</p><p> copyKey(L.r[0] ,L.r[i]); //復(fù)制為哨兵</p><p> copyKey(L.r[i] ,L.r[i - 1]);&l
26、t;/p><p> for(int j = i - 2;LT(L.r[0].key,L.r[j].key); --j)</p><p><b> {</b></p><p> copyKey(L.r[j + 1] ,L.r[j]); //記錄后移</p><p><b> }</b&
27、gt;</p><p> copyKey(L.r[j + 1] ,L.r[0]); //插入到正確的位置</p><p><b> }</b></p><p><b> }</b></p><p> }//InsertSort</p><p> //***
28、**********************希爾排序*************************\</p><p> void shellInsert(SqList &L,int dk)</p><p> { //對順序表L做一希爾插入排序。</p><p> //1.前后記錄位置的增量式是dk,而不是1;</p><p&
29、gt; //2.r[0]只是暫存單元,不是哨兵。當(dāng) j<= 0時,插入位置已找到</p><p> for(int i = dk + 1;i <= L.length; ++i)</p><p><b> {</b></p><p> if(LT(L.r[i].key,L.r[i - dk].key))</p>
30、<p> { //需將L.r[i]插入到有序增量子表</p><p> copyKey(L.r[0] ,L.r[i]); //暫存在L.r[0]中</p><p> for(int j = i - dk;j > 0 && LT(L.r[0].key,L.r[j].key); j-= dk)</
31、p><p> copyKey(L.r[j + dk] ,L.r[j]); //記錄后移</p><p> copyKey(L.r[j + dk] ,L.r[0]); //插入</p><p><b> }</b></p><p><b> }</b>
32、;</p><p> }//ShellInsert</p><p> void ShellSort(SqList &L,int dlta[],int t)</p><p> { //按增量序列dlta[0……t - 1]對順序表L作希爾排序</p><p> for(int k = 0;k < t;
33、 ++k)</p><p> shellInsert(L,dlta[k]); //一趟增量為dlta[k]的插入排序</p><p> }//ShellSort</p><p> //**************起泡排序****************************\</p><p> void BublleSort(Sq
34、List &L)</p><p><b> {</b></p><p> int i = L.length;</p><p> while(i > 1)</p><p><b> {</b></p><p> int lastExchangeIndex
35、 = 1;</p><p> for(int j = 1;j < i ;j ++)</p><p><b> {</b></p><p> if(LT(L.r[j + 1].key,L.r[j].key)) //小于成立進(jìn)行交換</p><p><b> {</b></p>
36、<p> swap(L.r[j + 1],L.r[j]);</p><p> lastExchangeIndex = j;</p><p><b> }</b></p><p><b> }</b></p><p> i = lastExchangeIndex;</p&
37、gt;<p><b> }</b></p><p> }//BubbleSort</p><p> /***************************簡單選擇排序********************/</p><p> int SelectMinKey(SqList L,int i)</p><
38、;p> { //在L.r[i..L.length]中選擇key最小的記錄</p><p> for(int j = i ;j <= L.length; ++j)</p><p><b> {</b></p><p> if(LT(L.r[j].key,L.r[i].key))</p
39、><p><b> {</b></p><p><b> i = j;</b></p><p><b> }</b></p><p><b> }</b></p><p> return i;
40、 //返回最小記錄下標(biāo)</p><p><b> }</b></p><p> void SelectSort(SqList &L)</p><p> { //對順序表做簡單選擇排序for(int i = 1;i < L.leng
41、th; ++i)</p><p> { //選擇第i小的記錄,并交換到位</p><p> int j = SelectMinKey(L,i);</p><p> //令j為L.r[i..L.length]中選擇key最小的記錄</p><p> if(i != j)</p&
42、gt;<p><b> {</b></p><p> swap(L.r[j],L.r[i]); //與第i記錄進(jìn)行交換</p><p><b> }</b></p><p><b> }</b></p><p> }//Selecte
43、Sort</p><p> /*********************快速排序*************/</p><p> int Partition(SqList &L,int low,int high)</p><p> { //交換順序表L中字表r[low……h(huán)igh]的記錄,樞軸記錄到位 ,并 </p><p>
44、 //返回其所在位置,此時在他之前(后)的記錄均不大(?。┡c它。</p><p> copyKey(L.r[0],L.r[low]);//用字表的第一個紀(jì)錄作樞軸記錄 </p><p> KeyTypepivotkey=L.r[low
45、].key; //樞軸記錄關(guān)鍵字</p><p> while(low < high)</p><p> { //從表的兩端交替向中間掃描</p><p> while(low<high&& !LT(L.r[high].key,pivotkey)) --high;</p&
46、gt;<p> copyKey(L.r[low],L.r[high]);</p><p> //將比樞軸記錄小的記錄移到低端</p><p> while(low<high && !LT(pivotkey,L.r[low].key))++low;</p><p> copyKey(L.r[high],L.r[low])
47、;</p><p> //將比樞軸記錄大的記錄移到高端</p><p><b> }</b></p><p> copyKey(L.r[low],L.r[0]); //樞軸記錄到位</p><p> return low;
48、 //返回樞軸位置</p><p> }//Partition</p><p> void QSort(SqList &L,int low,int high)</p><p> { //對順序表L中的子序列L.r[low……h(huán)igh]做快速排序</p><p> if(low < high)<
49、/p><p> { //長度> 1</p><p> int pivotloc = Partition(L,low,high); </p><p> //將L.r[low……h(huán)igh]一分為二</p><p> QSort(L,low,p
50、ivotloc - 1); </p><p> //對低子表遞歸排序,pivotloc是樞軸位置</p><p> QSort(L,pivotloc + 1,high); </p><p> //對高子表遞歸排序</p><p><b> }</b></p><p><b>
51、 }//QSort</b></p><p> void QuickSort(SqList &L)</p><p> { //對順序表L做快速排序</p><p> QSort(L,1,L.length);</p><p> }//QuickS
52、ort</p><p> /*************************堆排序*********************/</p><p> void HeapAdjust(SqList &L,int s,int m)</p><p> { //已知L.r[s...m]中記錄的關(guān)鍵字除L.r[s].key之外均滿足定義,</p>
53、<p> //本函數(shù)調(diào)整H.r[s]的關(guān)鍵字,使H.r[s...m]成為一個大頂對</p><p> RedType rc = L.r[s];</p><p> for(int j = 2 * s;j <= m;j *= 2)</p><p> { //沿key較大的孩子結(jié)點(diǎn)向下帥選<
54、/p><p> if(j < m && LT(L.r[j].key,L.r[j+1].key)) ++j;</p><p> //j 為key較大的記錄的下標(biāo)</p><p> if(!LT(rc.key,L.r[j].key)) break;//rc應(yīng)插入在位置s上</p><p> copyKey(L.r
55、[s],L.r[j]);</p><p><b> s = j;</b></p><p><b> }</b></p><p> L.r[s] = rc; //插入</p><p> }//HeapAdjust&
56、lt;/p><p> void HeapSort(SqList &L)</p><p> {//對順序表L進(jìn)行堆排序</p><p> for(int i=L.length/2;i>0;--i)</p><p> //把L.r[1....H.length]建成大頂堆</p><p> HeapAdj
57、ust(L,i,L.length);</p><p> for( i = L.length;i >1; --i)</p><p><b> {</b></p><p> swap(L.r[1],L.r[i]); //將堆頂記錄和當(dāng)前未經(jīng)排序的子序列</p><p> // L.r[1……i]中最后一個記錄進(jìn)
58、行交換</p><p> HeapAdjust(L,1,i - 1);//將L.r[1....i-1]重新調(diào)整為大頂堆</p><p><b> }</b></p><p> }//HeapSort</p><p> 2.主函數(shù)和其他輔助函數(shù)的偽碼算法</p><p> #include
59、<stdlib.h> //產(chǎn)生隨機(jī)數(shù)所需的庫函數(shù)</p><p> /*****************************主函數(shù)************************/</p><p> int main()</p><p><b> {</b></p><p&g
60、t; int arry[MAXSIZE + 1]; //存放排序前數(shù)組</p><p> int typeChoice; //根據(jù)提示鍵入的類型選擇序號</p><p> int methodChoice; //根據(jù)提示鍵入的方法選擇序號</p><p> int seed;
61、 //用于產(chǎn)生隨機(jī)數(shù)的種子</p><p> PrintArrayMenu(); //打印選擇待排序表的類型菜單</p><p> switch(typeChoice)</p><p><b> {</b></p><p> case 1:選擇的是順序表,初
62、始化鏈表并打印</p><p><b> break;</b></p><p> case 2:選擇的是逆序表,初始化鏈表并打印</p><p><b> break;</b></p><p> case 3:選擇的是隨機(jī)數(shù)表</p><p> srand(seed
63、);</p><p> //初始化隨機(jī)數(shù),并利用rand()產(chǎn)生隨機(jī)數(shù)并打印</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p>&l
64、t;b> }</b></p><p> cout <<L.length; //打印待排序數(shù)組的長度</p><p> PrintMenu(); //打印排序方法選擇菜單</p><p> while(methodChoice!= 7)&
65、lt;/p><p><b> {</b></p><p> getChoice(L,choice); </p><p> //根據(jù)選擇的方法堆表進(jìn)行排序操作并打印相關(guān)信息</p><p> for( j = 1;j <= MAXSIZE; j ++)</p><p> {
66、 //將鏈表恢復(fù)至未排序時狀態(tài)</p><p> L.r[j].key = arry[j];</p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b>&l
67、t;/p><p><b> }</b></p><p> /****************根據(jù)選擇排序********************/</p><p> void getChoice(SqList &L,int c)</p><p> {
68、 //根據(jù)選擇進(jìn)行排序并輸出相關(guān)信息</p><p> int Array[3] = {5,3,1}; //希爾排序所需增量數(shù)組</p><p><b> switch(c)</b></p><p><b> {</b></p><p><b> cas
69、e 1:</b></p><p> InsertSort(L); // 直接插入排序 </p><p> outPut(L); //輸出關(guān)鍵字比較次數(shù)和移動次數(shù)</p><p><b> break;</b></p>&l
70、t;p><b> case 2:</b></p><p> ShellSort(L,Array,3); //希爾排序</p><p> outPut(L); //輸出關(guān)鍵字比較次數(shù)和移動次數(shù)</p><p><b> break;<
71、;/b></p><p><b> case 3:</b></p><p> BublleSort(L); //起泡排序</p><p> outPut(L); //輸出關(guān)鍵字比較次數(shù)和移動次數(shù)</p><p>
72、;<b> break;</b></p><p><b> case 4:</b></p><p> SelectSort(L); //簡單選擇排序</p><p> outPut(L); //輸出關(guān)鍵字比較次數(shù)和移動次數(shù)&
73、lt;/p><p><b> break;</b></p><p><b> case 5:</b></p><p> QuickSort(L); //快速排序</p><p> outPut(L);
74、 //輸出關(guān)鍵字比較次數(shù)和移動次數(shù)</p><p><b> break;</b></p><p><b> case 6:</b></p><p> HeapSort(L); //堆排序</p><p> ou
75、tPut(L); //輸出關(guān)鍵字比較次數(shù)和移動次數(shù)</p><p><b> break;</b></p><p> case 7:排序結(jié)束</p><p><b> default:</b></p><p><b> break;</b&g
76、t;</p><p><b> }</b></p><p><b> }</b></p><p> 函數(shù)的調(diào)用關(guān)系圖反映了程序的層次結(jié)構(gòu)</p><p> InsertSort </
77、p><p> 順序表 ShellSort </p><p> BublleSor
78、t </p><p> 逆序表 getTypeChoice getMethodChoice</p><p> SelectSort </p><
79、;p> 隨機(jī)數(shù)表 QuickSort </p><p><b> HeapSort</b></p><p> srand rand</p><p><
80、b> 排序算法結(jié)果比較</b></p><p> 對各種表長和測試組數(shù)進(jìn)行了測試,程序運(yùn)行正常。分析實(shí)測得到的數(shù)值,六種排序算法的特點(diǎn)小結(jié)如下:</p><p><b> 五、附錄</b></p><p><b> 源程序文件名清單:</b></p><p> SqLis
81、t.H //可排序表的實(shí)現(xiàn)</p><p> main.C //主程序</p><p> 實(shí)驗(yàn)中遇到的問題及解決辦法</p><p> 1.程序采取循序漸進(jìn)的策略。首先設(shè)計和實(shí)現(xiàn)可排序表的建立操作,根據(jù)要求因包括隨機(jī)數(shù)序列、正序和逆序三種情況,為避免不必要的錯誤,程序采用了先定義了兩個數(shù)組,分
82、別為正序和逆序,程序運(yùn)行時分別將數(shù)組的值賦給鏈表的方式進(jìn)行順序表的建立,另外,起初對于隨機(jī)數(shù)的產(chǎn)生產(chǎn)生了疑惑,但隨后通過搜集資料成功的使用srand(seed)和rand()函數(shù)得到解決。然后用插入排序驗(yàn)證了各種內(nèi)部輔助操作的正確性,進(jìn)而逐個加入其他排序算法,最后完成對測試結(jié)果的顯示。</p><p> 2.程序旨在進(jìn)行六種排序方法優(yōu)劣性的比較,在進(jìn)行對六種排序依次排序時,出現(xiàn)了進(jìn)行過依次排序后,排序表變?yōu)檎?/p>
83、表而之后的集中排序方法都是在進(jìn)行正序表的排序,而沒有達(dá)到想要的效果,最后在主函數(shù)中添加了一個數(shù)組,用于記錄原排序表的順序,并在每次排序之后利用該數(shù)組對排序表進(jìn)行再次建立,使得問題成功解決。</p><p> 3.開始編程之初,總會出現(xiàn)關(guān)鍵字比較和移動次數(shù)的計算錯誤,在程序中進(jìn)行逐步記錄既繁瑣又易出錯,之后經(jīng)過思考,建立了copyKey()和swap()函數(shù),成功提高了程序效率并降低了計算錯誤率。</p&g
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(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è)計---排序算法比較
- 數(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è)計--各種內(nèi)部排序性能比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--內(nèi)部排序演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--內(nèi)部排序算法的性能分析
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告---排序算法的實(shí)現(xiàn)與比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告內(nèi)部排序的算法設(shè)計與分析
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---排序算法的實(shí)現(xiàn)
- 內(nèi)部排序課程設(shè)計---內(nèi)部排序算法的比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--排序算法演示系統(tǒng)
- 拓?fù)渑判?算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--幾種排序算法的演示
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計排序算法演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--排序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---排序綜合
評論
0/150
提交評論