分治法實(shí)現(xiàn)一組無序序列的兩路合并排序和快速排序_第1頁
分治法實(shí)現(xiàn)一組無序序列的兩路合并排序和快速排序_第2頁
分治法實(shí)現(xiàn)一組無序序列的兩路合并排序和快速排序_第3頁
分治法實(shí)現(xiàn)一組無序序列的兩路合并排序和快速排序_第4頁
分治法實(shí)現(xiàn)一組無序序列的兩路合并排序和快速排序_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí) 驗(yàn) 報 告(2011/2012學(xué)年 第一學(xué)期)課程名稱算法分析與設(shè)計(jì)A實(shí)驗(yàn)名稱分治策略實(shí)驗(yàn)時間年月日指導(dǎo)單位計(jì)算機(jī)學(xué)院軟件工程系指導(dǎo)教師學(xué)生姓名班級學(xué)號學(xué)院(系)專 業(yè)實(shí) 驗(yàn) 報 告實(shí)驗(yàn)名稱分治策略指導(dǎo)教師實(shí)驗(yàn)類型驗(yàn)證實(shí)驗(yàn)學(xué)時2實(shí)驗(yàn)時間一、 實(shí)驗(yàn)?zāi)康暮腿蝿?wù)理解分治法的算法思想,閱讀實(shí)現(xiàn)書上已有的部分程序代碼并完善程序,加深對分治法的算法原理及實(shí)現(xiàn)過程的理解。 用分治法實(shí)現(xiàn)一組無序序列的兩路合并排序和快速排序。要求清楚合并排序及快速排序的基本原理,編程實(shí)現(xiàn)分別用這兩種方法將輸入的一組無序序列排序?yàn)橛行蛐蛄泻筝敵觥?二、 實(shí)驗(yàn)環(huán)境(實(shí)驗(yàn)設(shè)備) VC+6.0三、實(shí)驗(yàn)原理及內(nèi)容(包括操作過程、結(jié)果

2、分析等)實(shí)驗(yàn)原理1、排序是數(shù)據(jù)處理中常用的重要手段,是指將一個元素序列調(diào)整為按指定關(guān)鍵字值的遞增(或遞減)次序排列的有序序列。用分治法求解排序問題的思路是,按某種方式將序列分成兩個或多個子序列,分別進(jìn)行排序,再將已排序的子序列合并成一個有序序列。合并排序和快速排序是兩種典型的符合分治策略的排序算法。 2、如果采用順序存儲的可排序表作為算法實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),則需要定義一個可排序表類SortableList,兩路合并算法和快速排序算法均由定義在該類上的函數(shù)實(shí)現(xiàn)。其中 Input函數(shù)和 Output函數(shù)分別用于向可排序表中輸入待排序序列,以及輸出已經(jīng)排序好的序列。3、兩路合并排序算法的基本思想是:將待

3、排序元素平分成大小大致相同的兩個子序列,然后對每個子序列分別使用遞歸的方法進(jìn)行兩路合并排序,直到子序列長度變?yōu)?,最后利用合并算法將得到的已排序好的兩個子序列合并成一個有序的序列。 兩路合并排序算法的核心部分是將子問題的解組合成原問題解得合并操作。常用的操作是新建一個序列,序列的大小等于要合并的兩個子序列的長度之和。比較兩個子序列中的最小值,輸出其中較小者到新建的序列中,重復(fù)此過程直到其中一個子序列為空。如果另一個子序列中還有元素未輸出,則將剩余元素依次輸出到新建序列中即可。最終得到一個有序序列。 4、結(jié)合書上已有的程序代碼,使用分治法的快速排序算法,實(shí)現(xiàn)對初始序列的排序。快速排序算法的基本思

4、想是:(1)在待排序序列 Kleft:right上選擇一個基準(zhǔn)元素(通常是最左邊的元素 Kleft),通過一趟分劃操作將序列分成左右兩個子序列,左子序列中所有元素都小于等于該基準(zhǔn)元素,有子序列中所有元素都大于等于該基準(zhǔn)元素。則當(dāng)前基準(zhǔn)元素所在的位置位于左、右子序列的中間,即是其排序完成后的最終位置。(2)通過遞歸調(diào)用,對左子序列和右子序列再分別進(jìn)行快速排序算法的調(diào)用。(3)由于每一趟分劃結(jié)束后,左子序列中的元素均不大于基準(zhǔn)元素,右子序列中的元素均不小于基準(zhǔn)元素。而每次分劃后,對分劃得到的左、右子序列的快速排序又均是就地進(jìn)行,所以一旦左、右兩個子序列都已分別排好序后,無需再執(zhí)行任何計(jì)算,整個序列

5、就是所要求的有序序列了。因此類中應(yīng)定義成員函數(shù) QuickSort來完成遞歸快速排序算法的調(diào)用和成員函數(shù)5、比較合并排序和兩種算法的異同。 問題分解過程: 合并排序?qū)⑿蛄幸环譃槎纯伞?(十分簡單) 快速排序需調(diào)用 Partition函數(shù)將一個序列劃分為子序列。(分解方法相對較困難)子問題解合并得到原問題解的過程:合并排序需要調(diào)用 Merge函數(shù)來實(shí)現(xiàn)。(Merge函數(shù)時間復(fù)雜度為O(n)).快速排序一旦左、右兩個子序列都已分別排序,整個序列便自然成為有序序列。(異常簡單,幾乎無須額外的工作,省去了從子問題解合并得到原問題解的過程) 基本程序(一) 兩路合并排序#include<iost

6、ream.h> class SortableList public: SortableList(int mSize) maxSize=mSize; l=new intmaxSize; n=0; SortableList() delete l; void MergeSort(); void Input(); void Output(); private: int *l; int maxSize; int n; void MergeSort(int left,int right); void Merge(int left,int mid,int right); void SortableLi

7、st:MergeSort() MergeSort(0,n-1); void SortableList:MergeSort(int left,int 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 intright-left+1; int i=left,j=mid+1,k=0; w

8、hile(i<=mid)&&(j<=right) if (li<=lj) tempk+=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:Input() for(int i=0;i<maxSize;i+) cin>>li; n+; void SortableList:Output() for(int i=0;i

9、<maxSize;i+) cout<<li<<" " cout<<endl; void main() SortableList l(10); cout<<"請輸入10個數(shù):"<<endl; l.Input(); l.MergeSort(); l.Output();(二)快速排序#include<iostream.h>class SortableListpublic: SortableList(int mSize) maxSize=mSize; l=new intmaxSize;

10、 n=0; SortableList() delete l; void QuickSort(); void Input(); void Output();private: int *l; int maxSize; int n;void Swap(int i,int j); void QuickSort(int left,int right);int Partition(int left,int right);void SortableList:Swap(int i,int j)int c=li;li=lj;lj=c;int SortableList:Partition(int left,int

11、 right)int i=left,j=right+1;dodo i+; while (li<lleft);do j-; while (lj>lleft);if (i<j) Swap(i,j);while (i<j);Swap(left,j);return j;void SortableList:QuickSort()QuickSort(0,n-1);void SortableList:QuickSort(int left,int right)if (left<right)int j=Partition(left,right);QuickSort(left,j-1);QuickSort(j+1,right);void SortableList:Input() for(int i=0;i<maxSize;i+) cin>>li; n+; void SortableList:Output() for(int i=0;i<maxSize;i+) cout<<li<<" " cout<

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論