版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
/實驗報告〔2015/2016學(xué)年第二學(xué)期課程名稱數(shù)據(jù)結(jié)構(gòu)A實驗名稱內(nèi)排序算法的實現(xiàn)以及性能比較實驗時間2016年5月26日指導(dǎo)單位計算機科學(xué)與技術(shù)系指導(dǎo)教師駱健學(xué)生姓名耿宙班級學(xué)號B14111615學(xué)院<系>管理學(xué)院專業(yè)信息管理與信息系統(tǒng)實習(xí)題名:內(nèi)排序算法的實現(xiàn)及性能比較班級B141116姓名耿宙學(xué)號B14111615日期2016.05.26問題描述驗證教材的各種內(nèi)排序算法,分析各種排序算法的時間復(fù)雜度;改進教材中的快速排序算法,使得當(dāng)子集合小于10個元素師改用直接插入排序;使用隨即數(shù)發(fā)生器產(chǎn)生大數(shù)據(jù)集合,運行上述各排序算法,使用系統(tǒng)時鐘測量各算法所需的實際時間,并進行比較。系統(tǒng)時鐘包含在頭文件"time.h"中。概要設(shè)計文件Sort.cpp中包括了簡單選擇排序SelectSort<>,直接插入排序InsertSort<>,冒泡排序BubbleSort<>,兩路合并排序Merge<>,快速排序QuickSort<>以及改進的快速排序GQuickSort<>六個內(nèi)排序算法函數(shù)。主主函數(shù)main的代碼如下圖所示:詳細設(shè)計類和類的層次設(shè)計在此次程序的設(shè)計中沒有進行類的定義。程序的主要設(shè)計是使用各種內(nèi)排序算法對隨機生成的數(shù)列進行排列,并進行性能的比較,除此之外還對快速排序進行了改進。下圖為主函數(shù)main的流程圖:main<>核心算法簡單選擇排序:簡單選擇排序的基本思想是:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。直接插入排序:插入排序的思想是將一組無序的元素分別插入一個已經(jīng)有序的的數(shù)組里,并保證插入后的數(shù)組也是有序的。當(dāng)所有無序組的元素都插入完畢時,一個有序數(shù)組構(gòu)造完成。數(shù)組n[1…r]為初始的一個無序數(shù)組〔為了直觀起見,我們這里設(shè)定數(shù)組從1開始,而不是0,則n[1]默認(rèn)為只有一個元素的有序數(shù)組,n[2]插入只有n[1]構(gòu)成的有序數(shù)組中,則此時有序數(shù)組的元素數(shù)量變?yōu)?。以此類推,到第i個元素時,前i-1個元素已經(jīng)是有序的,此時只需將第i個元素插入到有序數(shù)組中并使之保持有序。如此直至最后一個元素插入完畢,整個插入排序完成。冒泡排序:冒泡排序每遍歷一次數(shù)組,便將最大的元素放到數(shù)組最后邊。下次遍歷將次大的元素放到數(shù)組倒數(shù)第二位,依次類推,直至將最小的元素放到最前邊,此時冒泡排序完成。快速排序:快速排序是采用了分而治之的思想,但與合并排序有所不同的是快速排序先"工作"〔這里是分割或partition,再遞歸??焖倥判虻闹饕枷胧潜WC數(shù)組前半部分小于后半部分的元素,然后分別對前半部分和后半部分再分別進行排序,直至所有元素有序。兩路合并排序兩路合并排序算法的基本思想是:將待排序元素平分成大小大致相同的兩個子序列,然后對每個子序列分別使用遞歸的方法進行兩路合并排序,直到子序列長度變?yōu)?,最后利用合并算法將得到的已排序好的兩個子序列合并成一個有序的序列。兩路合并排序算法的核心部分是將子問題的解組合成原問題解得合并操作。常用的操作是新建一個序列,序列的大小等于要合并的兩個子序列的長度之和。比較兩個子序列中的最小值,輸出其中較小者到新建的序列中,重復(fù)此過程直到其中一個子序列為空。如果另一個子序列中還有元素未輸出,則將剩余元素依次輸出到新建序列中即可。最終得到一個有序序列。此外還對快速排序進行了改進,改進算法流程圖如下所示:GQuickSort<>四、程序代碼template<classT>voidGQuickSort<TA[],intn>//改進的快速排序{ GQSort<A,0,n-1>;}template<classT>voidGQSort<TA[],intleft,intright>{ inti,j; if<right>=9> { if<left<right> { i=left; j=right+1; do { doi++;while<A[i]<A[left]>; doj--;while<A[j]>A[left]>; if<i<j> Swap<A[i],A[j]>; }while<i<j>; Swap<A[left],A[j]>; QSort<A,left,j-1>; QSort<A,j+1,right>; } } else { InsertSort<A,right-left+1>; return; }}五、測試和調(diào)試測試用例和結(jié)果測試結(jié)果如下圖生成隨機數(shù)據(jù)簡單選擇排序及其所需時間直接插入排序及其所需時間冒泡排序及其所需時間快速排序及其所需時間改進快速排序及其所需時間兩路合并排序及其所需時間結(jié)果分析簡單選擇排序的最好、最壞的平均情況的時間復(fù)雜度都為O<n2>,是不穩(wěn)定的排序方法;直接插入排序的最好情況的時間復(fù)雜度為O<n>,最壞情況的時間復(fù)雜度為O<n2>;冒泡排序最好情況的時間復(fù)雜度為O<n>,最壞情況的時間復(fù)雜度為O<n2>,是穩(wěn)定的排序方法;快速排序最好情況的時間復(fù)雜度為O<n2>,最壞情況的時間復(fù)雜度為O<nlog2n>,是不穩(wěn)定的排序方法;兩路合并排序的時間復(fù)雜度為O<nlog2n>,是穩(wěn)定的排序方法。實習(xí)小結(jié)在這次實驗中,我們對內(nèi)部排序算法進行了比較以及性能分析,通過這次實驗,我們加深了對內(nèi)部排序算法的理解,對內(nèi)部排序算法的基本運算的實現(xiàn)有所掌握,對課本中所學(xué)的各種數(shù)據(jù)結(jié)構(gòu)進一步理解和掌握,學(xué)會了如何把學(xué)到的知識用于解決實際問題,鍛煉了自己動手的能力。通過這次實驗,我明白了,沒有總是最好的排序方法。對于一般列表,快速排序、希的性能較好。通過本次實驗,我深刻體會到問題解決方案的重要性,算法效率分析的必要性。法時。附錄:#include<iostream.h>#include<stdlib.h>#include<time.h>template<classT>voidSwap<T&a,T&b>{ Ttemp=a; a=b; b=temp;}template<classT>voidSelectSort<TA[],intn>//簡單選擇排序{ intsmall; for<inti=0;i<n-1;i++> { small=i; for<intj=i+1;j<n;j++> if<A[j]<A[small]> small=j; Swap<A[i],A[small]>; }}template<classT>voidInsertSort<TA[],intn>//直接插入排序{ for<inti=1;i<n;i++> { intj=i; Ttemp=A[j]; while<j>0&&temp<A[j-1]> { A[j]=A[j-1]; j--; } A[j]=temp; }}template<classT>voidBubbleSort<TA[],intn>//冒泡排序{ inti,j,last; i=n-1; while<i>0> { last=0; for<j=0;j<i;j++> if<A[j+1]<A[j]> { Swap<A[j],A[j+1]>; last=j; } i=last; }}template<classT>voidQuickSort<TA[],intn>//快速排序{ QSort<A,0,n-1>;}template<classT>voidQSort<TA[],intleft,intright>{ inti,j; if<left<right> { i=left; j=right+1; do { doi++;while<A[i]<A[left]>; doj--;while<A[j]>A[left]>; if<i<j> Swap<A[i],A[j]>; }while<i<j>; Swap<A[left],A[j]>; QSort<A,left,j-1>; QSort<A,j+1,right>; }}template<classT>voidGQuickSort<TA[],intn>//改進的快速排序{ GQSort<A,0,n-1>;}template<classT>voidGQSort<TA[],intleft,intright>{ inti,j; if<right>=9> { if<left<right> { i=left; j=right+1; do { doi++;while<A[i]<A[left]>; doj--;while<A[j]>A[left]>; if<i<j> Swap<A[i],A[j]>; }while<i<j>; Swap<A[left],A[j]>; QSort<A,left,j-1>; QSort<A,j+1,right>; } } else { InsertSort<A,right-left+1>; return; }}template<classT>voidMerge<TA[],inti1,intj1,inti2,intj2>//兩路合并排序{ T*Temp=newT[j2-i1+1]; inti=i1,j=i2,k=0; while<i<=j1&&j<=j2> { if<A[i]<=A[j]> Temp[k++]=A[i++]; elseTemp[k++]=A[j++]; } while<i<=j1> Temp[k++]=A[i++]; while<j<=j2> Temp[k++]=A[j++]; for<i=0;i<k;i++> A[i1++]=Temp[i]; delete[]Temp;}template<classT>voidMergeSort<TA[],intn>{ inti1,j1,i2,j2; intsize=1; while<size<n> { i1=0; while<i1+size<n> { i2=i1+size; j1=i2-1; if<i2+size-1>n-1> j2=n-1; else j2=i2+size-1; Merge<A,i1,j1,i2,j2>; i1=j2+1; } size*=2; }}intmain<>{ clock_tstart,finish; srand<time<NULL>>; intn=1000; int*a=newint[n]; int*b=newint[n]; int*c=newint[n]; int*d=newint[n]; int*e=newint[n]; int*f=newint[n]; cout<<"待排序序列為:"<<endl; for<inti=0;i<n;i++> { a[i]=rand<>%91; cout<<a[i]<<""; b[i]=a[i]; c[i]=a[i]; d[i]=a[i]; e[i]=a[i]; f[i]=a[i]; } cout<<endl; start=clock<>; SelectSort<a,n>; cout<<"經(jīng)過簡單選擇排序后的序列為:"<<endl;for<i=0;i<n;i++> cout<<a[i]<<""; cout<<endl; finish=clock<>; cout<<"開始時間為:"<<start<<" "<<"結(jié)束時間為:"<<finish<<""<<"持續(xù)時間為:"<<<double><finish-start>/CLOCKS_PER_SEC<<endl; start=clock<>; InsertSort<b,n>; cout<<"經(jīng)過直接插入排序后的序列為:"<<endl; for<i=0;i<n;i++> cout<<b[i]<<""; cout<<endl; finish=clock<>; cout<<"開始時間為:"<<start<<" "<<"結(jié)束時間為:"<<finish<<""<<"持續(xù)時間為:"<<<double><finish-start>/CLOCKS_PER_SEC<<endl; start=clock<>; BubbleSort<c,n>; cout<<"經(jīng)過冒泡排序后的序列為:"<<endl; for<i=0;i<n;i++> cout<<c[i]<<""; cout<<endl; finish=clock<>; cout<<"開始時間為:"<<start<<" "<<"結(jié)束時間為:"<<finish<<""<<"持續(xù)時間為:"<<<double><finish-start>/CLOCKS_PER_SEC<<endl; start=clock<>; QuickSort<d,n>; cout<<"經(jīng)過快速排序后的序列為:"<<endl; for<i=0;i<n;i++> cout<<d[i]<<"
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年銷售協(xié)議文檔核心條款強調(diào)
- 2024年電梯委托物業(yè)管理協(xié)議3篇
- 2024年網(wǎng)絡(luò)安全評估服務(wù)合同的評估標(biāo)準(zhǔn)、評估流程與責(zé)任分配
- 2024年結(jié)算委托:借貸關(guān)系中的轉(zhuǎn)款協(xié)議
- 2025版勞動人事爭議仲裁院仲裁員職業(yè)規(guī)劃與發(fā)展合同3篇
- 2024年版部門經(jīng)理級聘用合同3篇
- 2024年跨區(qū)域物流配送合作合同
- 《形容詞用法總結(jié)》課件
- 媒體服務(wù)員工作總結(jié)
- 2024款二手車買賣協(xié)議標(biāo)準(zhǔn)格式版B版
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之18:“7支持-7.1資源”(雷澤佳編制-2025B0)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之17:“6策劃-6.6合作”(雷澤佳編制-2025B0)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之16:“6策劃-6.5組織結(jié)構(gòu)”(雷澤佳編制-2025B0)
- GB/T 45016-2024發(fā)動機附件帶傳動系統(tǒng)機械式自動張緊輪試驗方法
- 南寧市三好學(xué)生主要事跡(8篇)
- 2024版玻璃幕墻工程材料采購合同2篇
- 全國英語教師賽課一等獎七年級上冊(人教2024年新編)《Unit 7 Happy Birthday》教學(xué)設(shè)計
- 2025年婦產(chǎn)科工作計劃
- 《寒假安全教育班會》課件模板四套
- (T8聯(lián)考)2025屆高三部分重點中學(xué)12月第一次聯(lián)考 生物試卷(含答案詳解)
- 報關(guān)稅費代繳服務(wù)合同
評論
0/150
提交評論