算法分治策略_第1頁
算法分治策略_第2頁
算法分治策略_第3頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、AU瑯磴Z薯實驗報告(2016/2017學年 第二學期)課程名稱算法分析與設計實驗名稱分治策略實驗時間2017年3月30日指導單位計算機學院軟件工程系指導教師張怡婷學生姓名霍淇濱班級學號B15041236學院係)計算機學院專業(yè)軟件工程實驗報告實驗名稱分治策略指導教師張怡婷實驗類型驗證型(第4個實驗密實驗學時 2 碼算法是“設計型”)實驗學時2實驗時間2017-3-30一、實驗目的和任務理解分治法的算法思想,閱讀實現(xiàn)書上已有的部分程序代碼并完善程序,加深對分治法的算法原理及實現(xiàn)過程的理解二、實驗環(huán)境(實驗設備)Visual Studio 2015三、實驗原理及內(nèi)容(包括操作過程、結(jié)果分析等)一、

2、用分治法實現(xiàn)一組無序序列的兩路合并排序和快速排序。要求清楚合并排序及快速排序的基本原理,編程實現(xiàn)分別用這兩種方法將輸入的一組無 序序列排序為有序序列后輸出。標頭.h#in cludeusing n amespace std;class SortableListpublic:SortableList(i nt mSize);SortableList();void In put();輸入數(shù)組void Output。;/輸岀數(shù)組void MergeSort();/兩路合并排序void Quicksort。;/快速排序private:int *l;/數(shù)組指針int maxSize;/數(shù)組最大長度int

3、 n;/數(shù)組已有元素個數(shù)void MergeSort(int left, int right);void Merge(int left, int mid, int right);void Swap(i nt i, i nt j);/交換函數(shù)void QuickSort(int left, int right);int Paritio n(i nt left, i nt right);/分割函數(shù);SortableList:SortableList(int mSize)maxSize = mSize;l = new in tmaxSize;n = 0;SortableList:SortableLi

4、st() deletel;void SortableList:I nput()cout 請輸入待排序的數(shù)組n;for (i nt i = 0; i li;if (li = -1)break;n+;void SortableList:Output()for (i nt i = 0; i n; i+) cout li ;void SortableList:MergeSort() MergeSort(0, n - 1); void SortableList:QuickSort() QuickSort(O, n - 1); void SortableList:MergeSort(int left, i

5、nt right)if (left right)int mid = (left + right) / 2; MergeSort(left, mid);MergeSort(mid + 1, right); Merge(left, mid, right);void SortableList:Merge(int left, int mid, int right)int *temp = new in tright - left + 1;int i = left, j = mid + 1, k = 0;while (i = mid) & (j = right)if (li = lj) tempk+ =

6、li+; else tempk+ = lj+;while (i = mid) tempk+ = li+;while (j = right) tempk+ = lj+; for (i = 0, k = left; k = right;)lk+ = tempi+;void SortableList:Swap(i nt i, i nt j)int c = li;li = lj;lj = c;void SortableList:QuickSort(int left, int right)if (left right)int j = Pariti on (left, right);QuickSort(l

7、eft, j - 1);QuickSort(j + 1, right);int SortableList:Parition(int left, int right)int i = left, j = right + 1;dodo i+; while (li lleft);if (i j) Swap(i, j); while (i j);Swap(left, j);return j;源.app#in clude#include標頭.husing n amespace std;void mai n()int n = 10;SortableList my1( n);SortableList my2(

8、 n);my1.I nput();my2.l nput();my1.MergeSort();my2.QuickSort();my1.Output();my2.Output();二、采用基于“五元中值組取中值分割法”(median-of-median-of-fivepartitioning)的線性 時間選擇算法,找出N個元素集合S中的第k個最小的元素,使其在線性時間內(nèi)解決。標頭.h#in cludeusing n amespace std;enum ResultCode OutOfBou nds,Success;class SortableListpublic:SortableList(i nt

9、 mSize);SortableList();void In put();void Output();ResultCode Select(i nt &x, i nt k);private:int *l;int maxSize;int n;void Swap(i nt i, i nt j);void InsertSort(int left, int right);int Partition(int left, int right);int Select(i nt k,i nt left,i nt right, int r);SortableList:SortableList(int mSize)

10、maxSize = mSize;l = new in tmaxSize;n = 0;SortableList:SortableList() deletel;void SortableList:I nput()cout 請輸入帶排序的數(shù)組n;for (i nt i = 0; i li;if 伸=-1)break;n+;void SortableList:Output()for (i nt i = 0; i n; i+) cout li ;void SortableList:Swap(i nt i, i nt j)int c = li;li = lj;lj = c;int SortableList

11、:Partition(int left, int right)int i = left, j = right + 1;dodo i+; while (li lleft); if (i j) Swap(i, j); while (i j);Swap(left, j);return j;ResultCode SortableList:Select(i nt &x, i nt k)if (n n | k = 0)return OutOfBou nds;int j = Select(k, 0,n - 1,5);x = lj;retur n Success;int SortableList:Select

12、(i nt k, int left, int right, i nt r)int n = right - left + 1;if (n = r) /若問題足夠小,使用直接插入排序In sertSort(left, right);return left + k - 1; /取其中的第k小元素,其下標為left+k-1for (i nt i = 1; i = n / r; i+)In sertSort(left + (i - 1)*r, left + i*r - 1); /二次取中規(guī)則求每組的中間值Swap(left + i - 1, left + (i - 1)*r + (in t)ceil(d

13、ouble)r / 2) - 1); /將每組的中間值交換到子表前部集中存放/求二次中間值,其下標為jint j = Select(int)ceil(double)n / r / 2), left, left + (n / r) - 1, r);Swap(left, j); /二次中間值為樞紐元,并換至left處j = Partiti on( left, right); /對表(子表)進行分劃操作if (k = j - left + 1)return j; / 返回第k小元素下標else if (kj - left + 1)return Select(k, left, j - 1, r);/在左子表求第 k小元素else return Select(k - (j - left + 1), j + 1, right, r); /在右子表求第 k-(j-left+1) 小元素void SortableList:lnsertSort(int left, int right)for (int i = left+1; i left & temp lj - 1)lj = lj - 1; j-;lj = tem

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論