內(nèi)部排序算法的性能分析_第1頁
內(nèi)部排序算法的性能分析_第2頁
內(nèi)部排序算法的性能分析_第3頁
內(nèi)部排序算法的性能分析_第4頁
內(nèi)部排序算法的性能分析_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告設(shè)計題目:內(nèi)部排序算法的性能分析 專 業(yè) 通信工程 班 級 0803 學(xué) 生 潘志威 學(xué) 號 2008115020312 指導(dǎo)教師 孫玉霞 起止時間 2011-2-212011-2-27 湖北師范學(xué)院 2011 年 第一 學(xué)期目錄1需求分析21.1、選題要求21.2、選題的意義及背景21.3、課程設(shè)計目標32概要設(shè)計32.1原始數(shù)據(jù)32.2輸出數(shù)據(jù)32.3數(shù)據(jù)處理43 算法描述53.1邏輯結(jié)構(gòu)及存儲結(jié)構(gòu)53.2系統(tǒng)的模塊劃分及模塊功能53.2.1主程序模塊53.2.2可排序表單元模塊63.3程序代碼64 調(diào)試分析15 測試結(jié)果25.1測試用例及選擇原因25.2 測試結(jié)果35

2、.3 結(jié)論35.4 結(jié)果分析36 心得體會47 參考文獻51需求分析1.1、選題要求對各種排序算法進行定量的性能分析。1.2、選題的意義及背景排序是計算機程序設(shè)計中的一種重要操作。它的功能是將一個數(shù)據(jù)元素的任意序列,重新排列成一個按關(guān)鍵字有序的序列。內(nèi)部排序的方法很多,但是就其全面性能而言,很難提出一種被認為是最好的方法,每一種方法都有各自的優(yōu)缺點,適合在不同的環(huán)境下使用。如果按排序過程中依據(jù)的不同原則對內(nèi)部排序方法進行分類,則大致可分為插入排序,交換排序,選擇排序,歸并排序和記數(shù)排序等五類。此實驗通過對起泡排序、直插排序、選擇排序、快速排序、歸并排序這幾種內(nèi)部排序算法進行比較,能使我們更好的

3、掌握這些排序的基本思想及排序算法。通過該題目的設(shè)計過程,可以加深理解各種數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)及相應(yīng)上運算的實現(xiàn),進一步理解和熟練掌握課本中所學(xué)的各種數(shù)據(jù)結(jié)構(gòu),學(xué)會如何把學(xué)到的知識用于解決實際問題,培養(yǎng)我們的動手能力。1.3、課程設(shè)計目標本課程設(shè)計對以下內(nèi)部排序算法進行比較:起泡排序、直插排序、選擇排序、快速排序、堆排序。待排序表的元素關(guān)鍵字為整數(shù),用不同的測試數(shù)據(jù)做測試比較。比較的指標為關(guān)鍵字的比較次數(shù)和關(guān)鍵字的移動次數(shù)。最后用圖、表格數(shù)據(jù)匯總數(shù)據(jù),以便對這些內(nèi)部排序算法進行性能分析。 2概要設(shè)計2.1原始數(shù)據(jù)用戶輸入記錄的個數(shù),數(shù)據(jù)由隨機數(shù)產(chǎn)生器生成。2.2輸出數(shù)據(jù)產(chǎn)生的隨機數(shù)分別用

4、起泡排序、直插排序、選擇排序、快速排序、歸并排序這些排序方法進行排序,輸出關(guān)鍵字的比較次數(shù)和移動次數(shù)。2.3數(shù)據(jù)處理主程序產(chǎn)生1組隨機數(shù)起泡排序直插排序快速排序堆排序選擇排序記錄關(guān)鍵字的比較次數(shù)和移動次數(shù)將隨機數(shù)保存在數(shù)組中循環(huán)50次輸出關(guān)鍵字的比較次數(shù)、移動次數(shù)的平均值3 算法描述3.1邏輯結(jié)構(gòu)及存儲結(jié)構(gòu)以順序表為存儲結(jié)構(gòu)typedef structkeytype key;datatype;3.2系統(tǒng)的模塊劃分及模塊功能mainselectsortbubblesortinsertsortquicksortheapsortoutput系統(tǒng)分為兩個模塊3.2.1主程序模塊void main()3

5、.2.2可排序表單元模塊冒泡排序:void bubblesort(datatype a,int n)插入排序:void insertsort(datatype a,int n)直接選擇排序:void selectsort(datatype a,int n)快速排序:void quicksort(datatype a,int low,int high)希爾排序:void shellsort(datatype a,int n,int d,int numofd)堆排序:void creatheap(datatype a,int n,int h)3.3程序代碼5頭文件:typedef int keyt

6、ype;typedef structkeytype key;datatype;static long int count1=0,count2=0;/*冒泡排序*/void bubblesort(datatype a,int n)int i,j,flag=1;datatype temp;for(i=1;in&flag=1;i+)flag=0;for(j=0;jaj+1.key)count2+;flag=1;temp=aj;count1+;aj=aj+1;count1+;aj+1=temp;count1+;/*插入排序*/void insertsort(datatype a,int n)int i

7、,j;datatype temp;for(i=0;i-1&temp.keyaj.key)count2+;aj+1=aj;count1+;j-;aj+1=temp;count1+;/*選擇排序*/void selectsort(datatype a,int n)int i,j,sm;datatype temp;for(i=0;in-1;i+)sm=i;/設(shè)第i個數(shù)據(jù)元素關(guān)鍵字最小for(j=i+1;jn;j+)/尋找關(guān)鍵字最小的數(shù)據(jù)元素if(aj.keyasm.key)sm=j;/記住最小元素的下標count2+;if(sm!=i)/當最小元素的下標不為i時交換位置temp=ai;count1+

8、;ai=asm;count1+;asm=temp;count1+;/*快速排序*/void quicksort(datatype a,int low,int high)/用遞歸方法對數(shù)據(jù)元素進行快速排序int i=low,j=high;datatype temp=alow;/取第一個元素為標準數(shù)據(jù)元素while(ij)while(ij&temp.key=aj.key)j-;/在數(shù)組的右端掃描count2+;if(ij)ai=aj;count1+;i+;while(ij&ai.keytemp.key)i+;/在數(shù)組的左端掃描count2+;if(ij)aj=ai;count1+;j-;ai=te

9、mp;count1+;if(lowi) quicksort(a,low,i-1);/對左端子集合進行遞歸if(ihigh) quicksort(a,j+1,high);/對右端子集合進行遞歸/*希爾排序*/void shellsort(datatype a,int n,int d,int numofd)/用希爾排序法對元素a0an-1排序,d0dm為希爾增量值int i,j,k,m,span;datatype temp;for(m=0;mnumofd;m+)span=dm;for(k=0;kspan;k+)/共span個小組for(i=k;i-1&temp.keyaj.key)count2+;

10、aj+span=aj;count1+;j=j-span;aj+span=temp;count1+;/*堆排序*/void creatheap(datatype a,int n,int h)int i,j,flag;datatype temp;i=h;/i為要建堆的二叉樹根結(jié)點下標j=2*i+1;/ j為i的左孩子結(jié)點的下標temp=ai;count1+;flag=0;/沿左右孩子中值較大者重復(fù)向下篩選while(jn&flag!=1)if(jn-1&aj.keyaj.key)flag=1;/標記結(jié)束篩選條件count2+;否則把aj上移else/ai=aj;count1+;i=j;j=2*i+

11、1;ai=temp;count1+;void initcreatheap(datatype a,int n)int i;for(i=(n-1)/2;i=0;i-)creatheap(a,n,i);void heapsort(datatype a,int n)int i,count=0;datatype temp;initcreatheap(a,n);/初始化創(chuàng)建最大堆for(i=n-1;i0;i-)/當前最大堆個數(shù)每次遞減1temp=a0;count1+;a0=ai;count1+;ai=temp;count1+;creatheap(a,i,0);/調(diào)整根結(jié)點滿足最大堆主程序:#include

12、#include#includesort.hvoid main()datatype r10000,r10000,a1000,b1000,c1000,e1000,f1000;int i,j,s; int p;int n; char yn; int d5=500,100,50,10,1; printf(請輸入產(chǎn)生隨機數(shù)個數(shù)n); scanf(%d,&p); n=p; while(1) int k=0; for(i=0;i(p/10);i+) srand(i+gettickcount(); for(j=0;j10;j+) rk.key=rand(); k+; printf(%8d,rk-1.key)

13、; printf(n*n);printf(1.測試冒泡排序n);printf(2.測試直接插入排序n);printf(3.測試選擇排序n);printf(4.測試快速排序n);printf(5.測試希爾排序n);printf(6.測試堆排序n);printf(*n);label_1:printf(請選擇); scanf(%d,&s);switch(s)case 1 : count1=0;count2=0;for(i=0;i10000;i+)ri.key=ri.key;bubblesort(r,n);printf(冒泡排序移動次數(shù)%dn,count1);printf(冒泡排序比較次數(shù)%dn,co

14、unt2);break;case 2:count1=0;count2=0;for(i=0;i10000;i+)ai.key=ri.key;insertsort(a,n);printf(直接插入排序移動次數(shù)%dn,count1);printf(直接插入排序比較次數(shù)%dn,count2);break; case 3:count1=0;count2=0;for(i=0;i10000;i+)bi.key=ri.key; selectsort(b,n);printf(選擇排序移動次數(shù)%dn,count1);printf(選擇排序比較次數(shù)%dn,count2); break;case 4:count1=0

15、;count2=0;for(i=0;i10000;i+)ci.key=ri.key;quicksort(c,0,n-1);printf(快速排序移動次數(shù)%dn,count1);printf(快速排序比較次數(shù)%dn,count2);break;case 5:count1=0;count2=0;for(i=0;i10000;i+)ei.key=ri.key; shellsort(e,n,d,5);printf(希爾排序移動次數(shù)%dn,count1);printf(希爾排序比較次數(shù)%dn,count2);break;case 6:count1=0;count2=0;for(i=0;i10000;i+

16、)fi.key=ri.key;heapsort(f,n,0);printf(堆排序移動次數(shù)%dn,count1);printf(堆排序比較次數(shù)%dn,count2);break;default:printf(選擇出錯!n); getchar(); printf(是否繼續(xù)測試其他測試方法(y/n):n); scanf(%c,&yn); if(yn=y|yn=y) goto label_1; printf(是否換數(shù)據(jù)重新測試(y/n):n); getchar(); scanf(%c,&yn); if(yn!=y&yn!=y) break; 4 調(diào)試分析進入調(diào)試界面后選擇要測試排序算法的序號,比如選

17、擇1,就對隨機產(chǎn)生的1000個數(shù)據(jù)用冒泡法進行測試,結(jié)果是冒泡排序執(zhí)行次數(shù)726450,然后選擇是否繼續(xù),若繼續(xù)選擇y,若退出測試選擇n。5 測試結(jié)果5.1測試用例及選擇原因記錄數(shù)分別輸入1000、10000、100000,之所以想用這三個記錄數(shù)測試,是想測試用選擇排序、起泡排序、直插排序、快速排序、歸并排序這五種排序方法,在記錄較小和較大時,關(guān)鍵字的比較次數(shù)和移動次數(shù),用以直觀的分析它們的性能。5.2 測試結(jié)果記錄數(shù)的個數(shù)關(guān)鍵字選擇排序起泡排序直插排序快速排序堆排序1000比較次數(shù)368194036移動次數(shù)186812182310000比較次數(shù)4851980199624688移動次數(shù)2817

18、3941564327409100000比較次數(shù)49850199800199984879984移動次數(shù)2974749592175354476854335.3 結(jié)論關(guān)鍵字選擇排序起泡排序直插排序快速排序堆排序記錄數(shù)比較次數(shù)較少最多最少較少較少較小移動次數(shù)較少最多較少較少較少比較次數(shù)較少最多最少較少較少較大移動次數(shù)最少最多較多較少較少5.4 結(jié)果分析(1)選擇排序的比較次數(shù)較少且為定值,但由于它在排序過程中要先查詢、再安置,所以性能上不夠穩(wěn)定。(2)起泡排序的比較次數(shù)和移動次數(shù)在這五種排序方式中最多,所以起泡排序的排序性能相對于其他排序要低好多。(3)直插排序的比較次數(shù)和移動次數(shù)相比較于其他幾種排序次數(shù)要少,所以效率相比較而言較高,性能較高,且較穩(wěn)定。從整體上來講性能較其他幾種排序較高。(4)快速排序在這幾種排序當中從比較次數(shù)較少的,移動次數(shù)多于選擇排序但低于其他三種排序,且其過程是先定一個基準,大小各放一邊,再分別對兩邊多次操作,達到整體有序,所以性能上來看是最快最好的,但是不夠穩(wěn)定。由此可見上述內(nè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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論