




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗報告(2015/2016學年第二學期)課程名稱實驗名稱 分治法實現快速排序與兩路合并排序實驗時間 年 月 日指導單位 十算機科學與技術系指導教師學生姓名 班級學號學院(系) 專業實驗報告
實驗名稱分治法指導教師實驗類型驗證 實驗學時 2實驗時間一、實驗目的和要求實驗目的:理解分治法的算法思想,閱讀實現書上已有的部分程序代碼并完善程序,加深對分治法的算法原理及實現過程的理解。實驗要求:用分治法實現一組無序序列的兩路合并排序和快速排序。要求清楚合并排序及快速排序的基本原理,編程實現分別用這兩種方法將輸入的一組無序序列排序為有序序列后輸出。二、實驗環境(實驗設備)硬件:微型計算機軟件:Windows操作系統、MicrosoftVisualC++6.0三、實驗原理及內容實驗原理:分治法:即分而治之。將問題分解為規模較小,相互獨立,類型相同的問題進行求解。對于無序數組的有序排序也就是按某種方式將序列分成兩個或多個子序列,分別進行排序,再將已排序的子序列合并成一個有序序列。實驗內容:兩路合并排序算法的基本思想是:將待排序元素序列一分為二,得到兩個長度基本相等的子序列,其過程類似于對半搜索;然后將子序列分別排序,如果子序列較長,還可以繼續細分,知道子序列長度不超過1為止。以上的實現由下列代碼執行:voidSortableList::MergeSort(){MergeSort(0,n-1);}voidSortableList::MergeSort(intleft,intright){if(left<right){intmid=(left+right)/2;MergeSort(left,mid);MergeSort(mid+1,right);Merge(left,mid,right);}}函數MergeSort是類SortableList上的公有成員函數。mid=(left+right)/2;將函數劃分為兩個長度基本相等的子序列,用遞歸來執行兩個子序列的內部排序。而Merge函數是將有序的子序列合并,通過合并過程將自問題的解組合成元問題的解。通過比較兩個序列中的最小者,輸出其中的較小者,重復此過程,直到一個序列為空,如果還有元素為輸出則輸出即可。其中對于Merge函數代碼如下:voidSortableList::Merge(intleft,intmid,intright)//將兩個長度之和為n的有序子序列合并一個有序序列{int*temp=newint[right-left+1];inti=left,j二mid+1,k=0;while((i〈二mid)&&(j<=right))if(l[i]<=l[j])temp[k++]=l[i++];elsetemp[k++]=l[j++];while(i<=mid)temp[k++]=l[i++];while(j<=right)temp[k++]=l[j++];for(i=0,k=left;k<=right;)l[k++]二temp[i++];}快速排序算法的基本思想是:在待排序序列K[left:right]上選擇一個基準元素(通常是最左邊的元素),通過一趟分劃操作將序列分成左右兩個子序列,左子序列中所有元素都小于等于該基準元素,有子序列中所有元素都大于等于該基準元素。劃分操作如下:intSortableList::Partition(intleft,intright){inti=left,j二right+1;do{doi++;while(l[i]<l[left]);doj--;while(l[j]>l[left]);if(i<j)Swap(i,j);}while(i<j);Swap(left,j);returnj;}則當前基準元素所在的位置位于左、右子序列的中間,即是其排序完成后的最終位置。通過遞歸調用,對左子序列和右子序列再分別進行快速排序算法的調用。由于每一趟分劃結束后,左子序列中的元素均不大于基準元素,右子序列中的元素均不小于基準元素。而每次分劃后,對分劃得到的左、右子序列的快速排序又均是就地進行,所以一旦左、右兩個子序列都已分別排好序后,無需再執行任何計算,整個序列就是所要求的有序序列了。因此類中應定義成員函數QuickSort來完成遞歸快速排序算法的調用和成員函數??焖倥判虿僮魅缦拢簐oidSortableList::QuickSort(){QuickSort(0,n-l);}voidSortableList::QuickSort(intleft,intright){if(left<right){intj二Partition(left,right);QuickSort(left,j-l);QuickSort(j+1,right);}}比較合并排序和快速排序的異同。合并排序一一將序列一分為二即可??焖倥判颉枵{用Partition函數將一個序列劃分為子序列。子問題解合并得到原問題解的過程:合并排序一一需要調用Merge函數來實現。(Merge函數時間復雜度為O(n))..快速排序一一一旦左、右兩個子序列都已分別排序,整個序列便自然成為有序序列。程序中的其他函數:輸入輸出函數:voidSortableList::Input(){for(inti=O;i<maxSize;i++){cin>>l[i];n++;}}voidSortableList::0utput(){for(inti=O;i<maxSize;i++){cout<<l[i]<<"";}}主函數:voidmain(){intn;inti;cout<<"***************************************"<<endl<<endl;cout<<" 1兩路合并排序"<<" "<<"2快速排序"<<endl<<endl;cout<<"***************************************"<<endl<<endl;while(l){cout<<"************請選擇排序方式*************"<<endl;cin>>i;if(i!=l&&i!=2){cout<<"fault"<<endl;break;}cout<<"***********請輸入比較個數************"<<endl;cin>>n;SortableListl(n);cout<<"************請輸入"<<n<〈"個數:*************"<<endl;l.Input();if(i=1)l.MergeSort();elsel.QuickSort();cout<<"************排序后序列是:***********"<<endl;l.0utput();cout<<endl;}}實驗結果:實驗用例(1)722657884280724860(2)00000
完整實驗代碼:#include<iostream.h>classSortableList{public:SortableList(intmSize)//構造函數{maxSize二mSize;l二newint[maxSize];n=0;}~SortableList()//析構函數{delete[]l;}voidMergeSort();voidQuickSort();voidInput();voidOutput();private:int*l;intmaxSize;intn;voidMergeSort(intleft,intright);voidMerge(intleft,intmid,intright);voidSwap(inti,intj);voidQuickSort(intleft,intright);intPartition(intleft,intright);};voidSortableList::Swap(inti,intj){intc=l[i];l[i]=l[j];l[j]=c;}intSortableList::Partition(intleft,intright){inti=left,j二right+1;do{doi++;while(l[i]<l[left]);doj--;while(l[j]>l[left]);if(i<j)Swap(i,j);}while(i<j);Swap(left,j);returnj;}voidSortableList::QuickSort(){QuickSort(0,n-l);}voidSortableList::QuickSort(intleft,intright){if(left<right){intj=Partition(left,right);QuickSort(left,j-l);QuickSort(j+1,right);}}voidSortableList::MergeSort(){MergeSort(0,n-l);}voidSortableList::MergeSort(intleft,intright){if(left<right){intmid=(left+right)/2;MergeSort(left,mid);MergeSort(mid+1,right);Merge(left,mid,right);}}voidSortableList::Merge(intleft,intmid,intright)//將兩個長度之和為n的有序子序列合并一個有序序列{int*temp=newint[right-left+1];inti=left,j二mid+l,k=0;while((i<=mid)&&(j〈二right))if(l[i]<=l[j])temp[k++]=l[i++];elsetemp[k++]=l[j++];while(i<=mid)temp[k++]=l[i++];while(j<=right)temp[k++]=l[j++];for(i=0,k=left;k〈二right;)l[k++]二temp[i++];}voidSortableList::Input(){for(inti=O;i<maxSize;i++){cin>>l[i];n++;}}voidSortableList::0utput(){for(inti=O;i<maxSize;i++){cout<<l[i]<<"";}}voidmain(){intn;inti;cout<<"***************************************"<<endl<<endl;cout<<" 1兩路合并排序"<<" "<<"2快速排序"<<endl<<endl;cout<<"***************************************"<<endl<<endl;while(l){cout<<"************請選擇排序方式*************"<<endl;cin>>i;if(i!=l&&i!=2){cout<<"fault"<<endl;break;}cout<<"***********請輸入比較個數************"<<endl;cin>>n;SortableListl(n);cout<<"******
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025安置房屋買賣合同模板
- 2025年罕見病藥物研發激勵政策深度分析與產業發展前景報告
- 納濾膜在醫藥純化中的應用行業深度調研及發展項目商業計劃書
- 陶瓷倉儲服務行業跨境出海項目商業計劃書
- 高效能垃圾壓縮轉運站行業深度調研及發展項目商業計劃書
- 纖維增重劑企業制定與實施新質生產力項目商業計劃書
- 2025年冷鏈物流溫控技術發展動態與質量保障體系構建關鍵要素分析報告
- 版語文二年級下冊 6樂三樂水 日月潭練習卷
- 2023屆福建省福州市普通高中畢業班5月質量檢測英語 含解析
- 智能農業GPS監控人員崗位職責
- 義務教育版(2024)四年級全一冊-第三單元第11課-嘀嘀嗒嗒的秘密-教案
- 《采氣樹基礎知識》課件
- 北交所開戶測試題20題
- 學校安全風險分級管控清單
- 近五年云南省中考數學真題及答案
- 綠色施工管理辦法
- 2024年安徽省中考物理試卷真題(含答案解析)+2023年中考物理試卷及答案
- 青年興則國家興青年強則國家強
- 藥物分析智慧樹知到答案2024年中國藥科大學
- 2023年海南省中考物理試題(解析版)
- 2024年北京中考地理試卷
評論
0/150
提交評論