版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、學(xué)號2014-2015學(xué)年第2學(xué)期高級語言程序設(shè)計課程設(shè)計報告題目:排序算法專業(yè):班級:姓名:指導(dǎo)教師:成績:計算機與信息工程系2015年3月26日引言1需求分析1第一章程序內(nèi)容及要求11.1 冒泡排序11.2 選擇排序2插入排序3第二章概要設(shè)計42.1冒泡排序42.2選擇排序52.3插入排序6第三章程序的比較及其應(yīng)用73.1時間復(fù)雜度73.2空間復(fù)雜度73.3穩(wěn)定程度73.4應(yīng)用及其改進8第四章程序設(shè)計結(jié)果9附錄9參考文獻13引言伴隨著社會的發(fā)展,數(shù)據(jù)也變得越來越龐大。如何將龐大的數(shù)據(jù)進行很好的排序,使用戶更加方便的查找資料,成了一件越來越重要的問題。對丁程序員來說,這將是一個挑戰(zhàn)。經(jīng)常查找
2、資料的朋友都會知道,面對海量的資料,如果其查找資料沒有進行排序,那么其查找資料將會是一家非常癰苦的事情。針對這一問題,我們自此通過一個課程設(shè)計來解決它。理論上排序算法有很多種,不過本課程設(shè)計只涉及到三種算法。這三種算法包括:冒泡排序,選擇排序,直接插入排序。本課程設(shè)計通過對這三種算法的運行情況進行對比,選擇最優(yōu)秀的算法出來。希望通過我的努力能解決一些問題,帶來一些方便。需求分析本課程題目是排序算法的實現(xiàn),由丁各方面的原因,本科程設(shè)計一共需要設(shè)計三種排序算法。這三種算法包括:冒泡排序,選擇排序,直接插入排序。三種排序算法各有獨到之處,因此我們要通過各種調(diào)試分析來比較其優(yōu)劣長短。由丁使用的調(diào)試軟件
3、及操作系統(tǒng)不一樣。因此個別程序在不同的軟件上可能會報錯。本課程軟件運行的的操作系統(tǒng)為Windows764位操作系統(tǒng)。所使用的軟件為MicrosoftVisualC+6.0以及TurboC2.0第一章程序內(nèi)容及要求1.1冒泡排序冒泡排序(BubbleSort,臺灣譯為:泡沫排序或氣泡排序)是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個算法的名字由來是因為越大的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端,故名。冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的
4、兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個和第2個數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個數(shù)和第3個數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,將最大的數(shù)放到了最后。在第二趟:仍從第一對數(shù)開始比較(因為可能由丁第2個數(shù)和第3個數(shù)的交換,使得第1個數(shù)不再小丁第2個數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個新的最大數(shù)(其實在整個數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過程,直至最終完成排序。用二重循環(huán)實現(xiàn),外循環(huán)變量設(shè)為i,內(nèi)循環(huán)變量設(shè)為j。假如有
5、10個數(shù)需要進行排序,則外循環(huán)重復(fù)9次,內(nèi)循環(huán)依次重復(fù)9,8,.,1次。每次進行比較的兩個元素都是與內(nèi)循環(huán)j有關(guān)的,它們可以分別用aj和aj+1標(biāo)識,i的值依次為1,2,.,9,對丁每一個i,j的值依次為1,2,.10-i。冒泡排序算法的性能1.2選擇排序每一趟從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€元素,順序放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。選擇排序是不穩(wěn)定的排序方法?;舅枷耄簄個記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果: 初始狀態(tài):無序區(qū)為R1.n,有序區(qū)為空。第1趟排序在無序區(qū)R1.n中選出關(guān)鍵字最小的記錄Rk,將它與無序區(qū)的第1個記錄R
6、1交換,使R1.1和R2.n分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū)。第i趟排序第i趟排序開始時,當(dāng)前有序區(qū)和無序區(qū)分別為R1.i-1和R(1in-1)。該趟排序從當(dāng)前無序區(qū)中選出關(guān)鍵字最小的記錄Rk,將它與無序區(qū)的第1個記錄R交換,使R1.i和R分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū)。這樣,n個記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。選擇排序法的第一層循環(huán)從起始元素開始選到倒數(shù)第二個元素,主要是在每次進入的第二層循環(huán)之前,將外層循環(huán)的下標(biāo)賦值給臨時變量,接下來的第二層循環(huán)中,如果發(fā)現(xiàn)有比這個最小位置處的元素更小的元素,則將
7、那個更小的元素的下標(biāo)賦給臨時變量,最后,在二層循環(huán)退出后,如果臨時變量改變,則說明,有比當(dāng)前外層循環(huán)位置更小的元素,需要將這兩個元素交換1.3插入排序有一個已經(jīng)有序的數(shù)據(jù)序列,要求在這個已經(jīng)排好的數(shù)據(jù)序列中插入一個數(shù),但要求插入后此數(shù)據(jù)序列仍然有序,這個時候就要用到一種新的排序方法-插入排序法,插入排序的基本操作就是將一個數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個新的、個數(shù)加一的有序數(shù)據(jù),算法適用丁少量數(shù)據(jù)的排序,時間復(fù)雜度為O(n&)。是穩(wěn)定的排序方法。插入算法把要排序的數(shù)組分成兩部分:第一部分包含了這個數(shù)組的所有元素,但將最后一個元素除外(讓數(shù)組多一個空間才有插入的位置),而第二部分就
8、只包含這一個元素(即待插入元素)。在第一部分排序完成后,再將這個最后元素插入到已排好序的第一部分中。插入排序的基本思想是:每步將一個待排序的紀(jì)錄,按其關(guān)鍵碼值的大小插入前面已經(jīng)排序的文件中適當(dāng)位置上,直到全部插入完為止。1. 從有序數(shù)列和無序數(shù)列a2,a3,,an開始進行排序;2. 處理第i個元素時(i=2,3,n),數(shù)歹Ua1,a2,ai-1是已有序的,而數(shù)歹Uai,ai+1,an是無序的。用ai與ai-1,ai-2,a1進行比較,找出合適的位置將ai插入;3. 重復(fù)第二步,共進行n-i次插入處理,數(shù)列全部有序。第二章概要設(shè)計2.1冒泡排序在要排序的一組數(shù)中,對當(dāng)前還未排好序的范圍內(nèi)的全部數(shù)
9、,自上而下對相鄰的兩個數(shù)依次進行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時,就將它們互換。for(i=0;i10;i+)第一輪循環(huán),輸入十個數(shù)據(jù)。scanf(“d,&ai);printf(n”);for(j=0;j9;j+)挨個判斷輸入的書的大小,第二輪循環(huán)for(i=0;iai+1t=ai;進行數(shù)的調(diào)換,把大的數(shù)據(jù)調(diào)到后面。ai=ai+1;ai+1=t;2.2選擇排序簡單選擇排序,每趟循環(huán)只能確定一個元素排序后的定位。我們可以考慮改進為每趟循環(huán)確定兩個元素(當(dāng)前趟最大和最小記錄)的位置,從而減少排序所需的循環(huán)次數(shù)。改進后對n個數(shù)據(jù)進行排
10、序,最多只需進行n/2趟循環(huán)即可。為數(shù)組a的元素個數(shù)voidselect_sort(inta,intn)/n(/進行N-1輪選擇for(inti=0;in-1;i+)(intmin_index=i;/找出第i小的數(shù)所在的位置for(intj=i+1;jn;j+)(if(ajamin_index)(min_index=j;/將第i小的數(shù),放在第i個位置;如果剛好,就不用交換if(i!=min_index)inttemp=ai;ai=amin_index;amin_index=temp;2.3插入排序?qū)⒁粋€記錄插入到已排序好的有序表中,從而得到一個新,記錄數(shù)增1的有序表。即:先將序列的第1個記錄看
11、成是一個有序的子序列,然后從第2個記錄逐個進行插入,直至整個序歹U有序為止。3434A3A131三*A5434(b)inttemp;for(inti=1;i=0&temparrj)/將當(dāng)前元素與之前的已經(jīng)排序好的序列元素進行挨個比較arrj+1=arrj;/已經(jīng)排序好的序列整體向后移動-j;arrj+1=temp;/插入當(dāng)前的元素第三章程序的比較及其應(yīng)用3.1時間復(fù)雜度冒泡排序算法的最差時間復(fù)雜度為O(n2),平均時間復(fù)雜度為O(n2)。選擇排序算法的最差時間復(fù)雜度為O(n2),平均時間復(fù)雜度為O(n2)。插入排序算法的最差時間復(fù)雜度為O(n2),平均時間復(fù)雜度為O(
12、n2)。冒泡排序和插入排序時間復(fù)雜度最好的情況下是O(n),而選擇排序時間復(fù)雜度最好的情況下是O(n2)。從時間復(fù)雜度比較來看。選擇排序的時間復(fù)雜度在以下情況下是沒有冒泡排序和插入排序的好。3.2空間復(fù)雜度冒泡排序,選擇排序,以及插入排序是空間復(fù)雜度都是。(1)。從空間復(fù)雜度來看,三者也沒有什么可以區(qū)分開來的。并不能直觀的看出優(yōu)劣。3.3穩(wěn)定程度冒泡排序和插入排序的穩(wěn)定程度都是比較穩(wěn)定的,只有選擇排序是不穩(wěn)定的。那么綜合上面的比較來看,選擇排序是最不好的,而冒泡排序以及插入排序是比較好的。冒泡排序是最慢的,但是也是最容易懂得。插入排序是比較快的,但是對丁自身的能力有一定的要求。當(dāng)然,這只是相對
13、而言。3.4應(yīng)用及其改進三種排序算法都可以應(yīng)用丁一些簡單排列數(shù)據(jù)的程序。也可以作為C語言初學(xué)者的練手的課題。對丁我們學(xué)習(xí)C語言也是一個不小的幫助。同時可以加深我們對丁循環(huán)和數(shù)組的理解及其應(yīng)用。同時我們可以對冒泡排序進行一點點的改進,使其更加的完善。冒泡算法的改進,當(dāng)排序的數(shù)據(jù)比較多時排序的時間會明顯延長。改進方法:快速排序:具體做法:任意選取某一記錄(通常取第一個記錄),比較其關(guān)鍵字與所有記錄的關(guān)鍵字,并將關(guān)鍵字比它小的記錄全部放在它的前面,將比它大的記錄均存放在它的后面,這樣,經(jīng)過一次排序之后,可將所有記錄以該記錄所在的分界點分為兩部分,然后分別對這兩部分進行快速排序,直至排序完。在冒泡排序
14、中,一趟掃描有可能無數(shù)據(jù)交換,也有可能有一次或多次數(shù)據(jù)交換,在傳統(tǒng)的冒泡排序算法及近年來的一些改進的算法中,只記錄一趟掃描有無數(shù)據(jù)交換的信息,對數(shù)據(jù)交換發(fā)生的位置信息則不予處理。為了充分利用這一信息,可以在一趟全局掃描中,對每一反序數(shù)據(jù)對進行局部冒泡排序處理,稱之為局部冒泡排序。局部冒泡排序與冒泡排序算法具有相同的時間復(fù)雜度,并且在正序和逆序的情況下,所需的關(guān)鍵字的比較次數(shù)和移動次數(shù)完全相同。由丁局部冒泡排序和冒泡排序的數(shù)據(jù)移動次數(shù)總是相同的,而局部冒泡排序所需關(guān)鍵字的比較次數(shù)常少丁冒泡排序,這意味著局部冒泡排序很可能在平均比較次數(shù)上對冒泡排序有所改進,當(dāng)比較次數(shù)較少的優(yōu)點不足以抵消其程序復(fù)雜
15、度所帶來的額外開銷,而當(dāng)數(shù)據(jù)量較大時,局部冒泡排序的時間性能則明顯優(yōu)丁冒泡排序。第四章程序設(shè)計結(jié)果插入排序算法的結(jié)果選擇排序算法的結(jié)果冒泡排序算法的結(jié)果附錄冒泡排序:#includevoidmain()(inta10;Inti,j,t;printf(“input10numbers:n”);for(i=0;i10;i+)scanf(“d,&ai);printf(n”);for(j=0;j9;j+)for(i=0;iai+1t=ai;ai=ai+1;ai+1=t;printf(“thesortednumbers:n”);printf(“d,ai);printf(n”);選擇排序:#include#
16、include#defineN8voidselect_sort(inta,intn);/選擇排序?qū)崿F(xiàn)為數(shù)組a的元素個數(shù)voidselect_sort(inta,intn)/n/進行N-1輪選擇for(inti=0;in-1;i+)intmin_index=i;/找出第i小的數(shù)所在的位置for(intj=i+1;jn;j+)(if(ajamin_index)(min_index=j;/將第i小的數(shù),放在第i個位置;如果剛好,就不用交換if(i!=min_index)(inttemp=ai;ai=amin_index;amin_index=temp;intmain()(intnumN=89,38,11,78,96,44,19,25;select_sort(num,N);for(inti=0;iN;i+)printf(%d,numi);printf(n);system(pause);return0;插入排序:#includeusingnamespacestd;voidInsertSort(intarr,intlength)(inttemp;for(inti=1;i=0&temparrj
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 注塑斜齒輪課程設(shè)計
- 線上課程設(shè)計和流程
- 需水量預(yù)測課程設(shè)計
- 需求工程培訓(xùn)課程設(shè)計
- 通信原理課程設(shè)計
- 電能與磁的轉(zhuǎn)換課程設(shè)計
- 2025年度航空航天設(shè)備采購合同范本11篇
- 2024門窗安全性能檢測與質(zhì)量認證服務(wù)合同3篇
- 2024版房屋租賃合同:短期商務(wù)公寓租賃協(xié)議
- 2024版毛竹供應(yīng)鏈合作合同范本版B版
- 《少兒主持人》課件
- 北京市朝陽區(qū)2024-2025學(xué)年高二上學(xué)期期末考試生物試卷(含答案)
- 2025年西藏拉薩市柳梧新區(qū)城市投資建設(shè)發(fā)展集團有限公司招聘筆試參考題庫附帶答案詳解
- 2025年部編版一年級語文上冊期末復(fù)習(xí)計劃
- 儲罐維護檢修施工方案
- 地理2024-2025學(xué)年人教版七年級上冊地理知識點
- 2024 消化內(nèi)科專業(yè) 藥物臨床試驗GCP管理制度操作規(guī)程設(shè)計規(guī)范應(yīng)急預(yù)案
- 2024-2030年中國電子郵箱行業(yè)市場運營模式及投資前景預(yù)測報告
- 基礎(chǔ)設(shè)施零星維修 投標(biāo)方案(技術(shù)方案)
- 人力資源 -人效評估指導(dǎo)手冊
- 大疆80分鐘在線測評題
評論
0/150
提交評論