




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù) 據(jù) 結(jié) 構(gòu) 實 驗 報 告實驗題目:幾種基本排序算法的實現(xiàn)姓名: 張耀班級: 計嵌151學(xué)號: 一、 實驗?zāi)康膶崿F(xiàn)直接插入排序,冒泡排序,簡單選擇排序,快速排序,希爾排序,堆排序等6種常用內(nèi)部排序算法,比較各算法的比較次數(shù)和移動次數(shù)。二、 數(shù)據(jù)結(jié)構(gòu)設(shè)計(1) 設(shè)計待排序記錄的存儲結(jié)構(gòu)。(2) 設(shè)計待排序數(shù)據(jù)的存儲結(jié)構(gòu)。(3) 輸入:待排序數(shù)據(jù)的數(shù)據(jù)個數(shù)和數(shù)據(jù)可由鍵盤輸入,也可由程序生成偽隨機數(shù),以菜單方式選擇上述排序方法中的一個,并指明輸出第幾趟排序的結(jié)果。(4)輸出:各趟排序結(jié)果或指定趟的排序結(jié)果,以及對應(yīng)的關(guān)鍵字比較次數(shù)和移動次數(shù)。三、 算法設(shè)計與N-S圖算法設(shè)計:編寫一個主函數(shù)mai
2、n(),在主函數(shù)中設(shè)計一個簡單的菜單,分別調(diào)用6種內(nèi)部排序算法。為了對各種排序算法的性能進行比較,算法中的主要工作是在已知算法的適當(dāng)位置插入對關(guān)鍵字的比較次數(shù)和移動次數(shù)的計數(shù)操作。為此,可設(shè)立一個實現(xiàn)排序算法中的關(guān)鍵字比較的函數(shù);設(shè)立一個實現(xiàn)排序算法中的關(guān)鍵字移動的函數(shù);設(shè)立一個實現(xiàn)排序算法中的關(guān)鍵字交換的函數(shù),從而解決比較次數(shù)和移動次數(shù)的統(tǒng)計問題。數(shù)據(jù)的輸入也可以通過菜單選擇輸入方式:鍵盤輸入或由偽隨機數(shù)程序生成數(shù)據(jù),以便隨時更換排序數(shù)據(jù),并按照不同要求對排序數(shù)據(jù)進行排序,輸出排序的結(jié)果以及對應(yīng)的關(guān)鍵字比較次數(shù)和移動次數(shù)。對于測試數(shù)據(jù),算法中可以考慮幾組數(shù)據(jù)的典型性,如正序,逆序和不同程度等
3、,以取得直觀的感受,從而對不同算法進行比較。四、 程序清單#includeusing namespace std;void showMenu()cout * 菜單 * endl;cout 1.直接插入排序 endl;cout 2.冒泡排序 endl;cout 3.簡單選擇排序 endl;cout 4.快速排序 endl;cout 5.希爾排序 endl;cout 6.堆排序 endl;cout 7.退出程序 endl;struct SqListint * key;int length;void CreateSqList(SqList &sl)/type為intint n;cout 建立順序表
4、endl 請輸入順序表的長度 n;sl.length = n;sl.key = new intsl.length + 1;cout 請輸入數(shù)據(jù): endl;for (int i = 1; i sl.keyi;void Copy(SqList &L1,SqList &L2)L2.length = L1.length;L2.key = new intL1.length + 1;for (int i = 1; i =L1.length; i+)L2.keyi = L1.keyi;void OutPut(SqList &L)for (int j = 1; j = L.length; +j)cout L
5、.keyj t;cout endl;void InsertSort(SqList & L)/對順序表L作直接插入排序int k = 0;int compare_Time, move_Time;compare_Time = move_Time = 0;for (int i = 2; i = L.length; i+)if (L.keyi = L.keyi - 1)/需將L.keyi插入有序子表L.key0 = L.keyi;/復(fù)制為哨兵L.keyi = L.keyi - 1;int j;for (j = i - 2; L.key0 = L.keyj; -j)compare_Time+;L.key
6、j + 1 = L.keyj;/記錄后移move_Time+;L.keyj + 1 = L.key0;/插入到正確位置k+;cout 第 k 趟排序結(jié)果:; OutPut(L);compare_Time+;cout 比較次數(shù)為: compare_Time endl; cout 移動次數(shù)為: move_Time endl;void BubbleSort(SqList & L)int k = 0;int compare_Time, move_Time;compare_Time = move_Time = 0;for (int i = 1; iL.length; i+)/用i控制比較趟數(shù)共n-1趟i
7、nt t;for (int j = 1; j L.keyj + 1)t = L.keyj;L.keyj = L.keyj + 1;L.keyj + 1 = t;move_Time+;k+;cout 第 k 趟排序結(jié)果:; OutPut(L);cout 比較次數(shù)為: compare_Time endl;cout 移動次數(shù)為: move_Time endl;int SelectMinKey(SqList& L, int n, int &compare_Time)int min = n;int minkey;/最小值minkey = L.keyn;for (int i = n + 1; i = L.
8、length; i+)if (L.keyiminkey)minkey = L.keyi;min = i;compare_Time+;return min;void SelectSort(SqList & L)/對順序表L作簡單選擇排序int j;int t;int k = 0;int move_Time = 0, compare_Time = 0;for (int i = 1; i = L.length; i+)j = SelectMinKey(L, i, compare_Time);/在L.keyi-L.keyL.length中選擇最小的記錄并將其地址賦給jif (i != j)/交換記錄t
9、 = L.keyi;L.keyi = L.keyj;L.keyj = t;move_Time+;compare_Time+;k+;cout 第 k 趟排序結(jié)果:; OutPut(L);cout 比較次數(shù)為: compare_Time endl;cout 移動次數(shù)為: move_Time endl;int Partition(SqList& L, int low, int high,int &compare_Time,int &move_Time)/交換順序表L中子表keylow-keyhigh中的記錄,樞軸記錄到位,并返回其所在位置,/此時在它之前(后)的記錄均不大(?。┯谒黫nt pivot
10、key;L.key0 = L.keylow;/用子表的第一個記錄作樞軸記錄pivotkey = L.keylow;/關(guān)鍵字while (lowhigh)/從表的兩端交替向中間掃描compare_Time+;while (low= pivotkey) -high;L.keylow = L.keyhigh;move_Time+;/將比樞軸小的記錄移至低端while (lowhigh&L.keylow = pivotkey) +low;L.keyhigh = L.keylow;/將比樞軸大的記錄移至高端move_Time+;L.keylow = L.key0;/樞軸記錄到位return low;/返
11、回樞軸位置void QSort(SqList& L, int low, int high,int &k,int &compare_Time,int &move_Time)int mid;/接收樞軸位置if (lowhigh)mid = Partition(L, low, high,compare_Time,move_Time);k+;cout 第 k 趟排序結(jié)果:; OutPut(L);QSort(L, low, mid - 1,k,compare_Time,move_Time);/對低子表進行排序QSort(L, mid + 1, high, k, compare_Time, move_Ti
12、me);/對高子表進行排序void QuitSort(SqList & L)/對順序表進行快速排序int k = 0;int compare_Time = 0, move_Time = 0;QSort(L, 1, L.length,k,compare_Time,move_Time);cout 比較次數(shù)為: compare_Time endl;cout 移動次數(shù)為: move_Time endl;void ShellInsert(SqList &L, int dk, int &compare_Time, int &move_Time)/對順序表進行一趟希爾插入排序for (int i = dk
13、+ 1; i = L.length; i+)if (L.keyi 0 & L.key0 = L.keyj; j -= dk)compare_Time+;L.keyj + dk = L.keyj;move_Time+;L.keyj + dk = L.key0;void ShellSort(SqList &L, int dlta, int t)int compare_Time = 0, move_Time = 0;/按增量序列dl0-dlt-1對順序表L作哈希排序for (int k = 0; k t; k+)ShellInsert(L, dltak, compare_Time, move_Tim
14、e);cout 第 k+1 趟排序結(jié)果:; OutPut(L);cout 比較次數(shù)為: compare_Time endl;cout 移動次數(shù)為: move_Time endl;void HeapAdjust(SqList& L, int s, int m, int &compare_Time, int &move_Time)/對順序表做查找,從值最大的孩子結(jié)點向下篩選,找到最大值int rc = L.keys;for (int j = 2 * s; j = m; j *= 2)if (jm&L.keyj L.keyj) break;/如果rc最大則推出while循環(huán)L.keys = L.ke
15、yj;/最大值賦值s = j;/交換位置move_Time+;L.keys = rc;void HeapSort(SqList & L)/對順序表L進行堆排序int value,i;int k = 0;int compare_Time = 0, move_Time = 0;for (i = L.length / 2; i0; i-)/把L.key1.L.length調(diào)整為大頂堆HeapAdjust(L, i, L.length, compare_Time, move_Time);for (i = L.length; i1; -i)value = L.key1;L.key1 = L.keyi;L
16、.keyi = value;HeapAdjust(L, 1, i - 1, compare_Time, move_Time);/將L.key1.i-1重新調(diào)整為大頂堆k+;cout 第 k 趟排序結(jié)果:; OutPut(L);cout 比較次數(shù)為: compare_Time endl;cout 移動次數(shù)為: move_Time endl;int main()int choice;SqList sq,sp;CreateSqList(sq);Copy(sq, sp);showMenu();cout choice;while (choice != 0)switch (choice)case 1:In
17、sertSort(sq); cout 最終結(jié)果:;OutPut(sq); break;case 2:BubbleSort(sq); cout 最終結(jié)果:;OutPut(sq); break;case 3:SelectSort(sq); cout 最終結(jié)果:;OutPut(sq); break;case 4:QuitSort(sq); cout 最終結(jié)果:;OutPut(sq); break;case 5:int *p, n;cout 請輸入增量個數(shù): n;p = new intn;cout 請輸入各個增量的值: endl;for (int i = 0; i pi;ShellSort(sq, p, n); cout 最終結(jié)果:;OutPut(sq); break;case 6:H
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)新人才職業(yè)發(fā)展路徑規(guī)劃考核試卷
- 慢性病防治技能培訓(xùn)考核試卷
- 家用紡織品品牌定位與消費者情感聯(lián)結(jié)策略分析考核試卷
- 兒童書籍讀后感
- 鄉(xiāng)鎮(zhèn)環(huán)保工作匯報
- 產(chǎn)業(yè)園區(qū)調(diào)研報告
- 化學(xué)助劑項目投資管理方案
- 山東省泰安市肥城市2025屆高三下學(xué)期高考適應(yīng)性測試(二)歷史試卷(含答案)
- 江鈴輕卡巡定展活動方案
- 比亞迪代言活動方案
- AVL-CRUISE-2019-整車經(jīng)濟性動力性分析操作指導(dǎo)書
- 藝術(shù)欣賞與實踐(高職)全套教學(xué)課件
- 富馬酸奧賽利定注射液-藥品臨床應(yīng)用解讀
- 胃早癌-經(jīng)典課件
- 2024IPv6 技術(shù)要求 第2部分:基于 IPv6 段路由(SRv6)的 IP 承載網(wǎng)絡(luò)
- 5WHY分析法培訓(xùn)課件
- 幕墻工安全技術(shù)交底
- 集裝箱七點檢查表
- 2023年湖北省高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試題試卷及答案解析
- 保定一中1+3物理試卷
- 弟子規(guī)注音A4直接打印版
評論
0/150
提交評論