


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)與算法統(tǒng)計(jì)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四學(xué)院:班級(jí):學(xué)號(hào):姓名:、實(shí)驗(yàn)?zāi)康?、熟悉VC環(huán)境,學(xué)會(huì)使用 C語(yǔ)言利用順序表解決實(shí)際問(wèn)題。2、通過(guò)上機(jī)、編程調(diào)試,加強(qiáng)對(duì)線性表的理解和運(yùn)用的能力。3、鍛煉動(dòng)手編程,獨(dú)立思考的能力。二、實(shí)驗(yàn)內(nèi)容從鍵盤輸入10個(gè)數(shù),編程實(shí)現(xiàn)分別用插入排序、交換排序、選擇排序算法進(jìn)行排序, 輸出排序后的序列。三、程序設(shè)計(jì)1 、概要設(shè)計(jì)為了實(shí)現(xiàn)排序的功能,需要將輸入的數(shù)字放入線性表中,進(jìn)行進(jìn)一步的排序操作。 (1)抽象數(shù)據(jù)類型:ADT SqList數(shù)據(jù)對(duì)象:d= ai |ai ElemSet,i1,2,K,n, n 0數(shù)據(jù)關(guān)系:R1= ai 1,aiD,i1,2,K ,n基本操作:I
2、nput(Sqlist & L)操作結(jié)果:構(gòu)造一個(gè)線性表L。output(SqList L)初始條件:線性表 L已存在。操作結(jié)果:按順序在屏幕上輸出L的數(shù)據(jù)元素。BiI nsertio nsort (Sqlist L)初始條件:線性表 L已存在。操作結(jié)果:對(duì)L的數(shù)據(jù)元素進(jìn)行折半插入排序。Quicksort (Sqlist L)初始條件:線性表 L已存在。操作結(jié)果:對(duì)L的數(shù)據(jù)元素進(jìn)行交換排序。SelectSort(SqList &L)初始條件:線性表 L已存在。操作結(jié)果:對(duì)L的數(shù)據(jù)元素進(jìn)行選擇排序。ADT SqList宏定義#defi ne KeyType int#define
3、MAXSIZE 10#define ok 1#defi ne error 0主程序流程由主程序首先調(diào)用In put(L)函數(shù)創(chuàng)建順序表,先調(diào)用BiInsertionsort(L)函數(shù)進(jìn)行折半插入排序,調(diào)用output(L)函數(shù)顯示排序結(jié)果。再調(diào)用QuickSort (L)函數(shù)進(jìn)行交換排序,調(diào)用output (L)函數(shù)顯示排序結(jié)果。函數(shù)顯示排序結(jié)果。最后調(diào)用SelectSort(L)函數(shù)進(jìn)行選擇排序,調(diào)用output(L)模塊調(diào)用關(guān)系由主函數(shù)模塊調(diào)用創(chuàng)建順序表模塊,排序模塊與顯示輸出模塊。(5)流程圖開(kāi)始輸入待排數(shù)字創(chuàng)建線性表進(jìn)行插入排序輸出排序結(jié)果進(jìn)行交換排序輸出排序結(jié)果進(jìn)行選擇排序輸出排序結(jié)
4、果結(jié)束2、詳細(xì)設(shè)計(jì)(1)數(shù)據(jù)類型設(shè)計(jì)/*順序存儲(chǔ)結(jié)構(gòu)*/typedef structKeyType Key; / 關(guān)鍵字項(xiàng) RedType;typedef structRedType rMAXSIZE+1;int len gth;/ =MAXSIZE; Sqlist;/(2)操作算法設(shè)計(jì)/*輸入數(shù)據(jù)*/int In put(Sqlist & L)for(int i=1;i<=MAXSIZE;i+)sea nf("%d",&L.ri.Key);L.le ngth=MAXSIZE;return ok;/*輸出排好的數(shù)字*/in t output(Sqlis
5、t L)for(i nt i=1;i<=MAXSIZE;i+)prin tf("%-4d",L.ri.Key);prin tf("n ”); return ok;/*折半插入排序法*/void BiI nserti on sort (Sqlist L)int i,j,low,high,m; for(i=2;i<=Len gth;i+)L.rO.Key=L.ri.Key; / low=1; high=i-1;while(low<=high) / m=(low+high)/2; if(L.rO.Key<L.rm.Key) else low=m+
6、1; for(j=i-1;j>=high+1;j-) /.rj+1=L.rj;L.rhigh+1=L.rO; II /lowprintf("折半插入排序:n");output(L);定義順序表類型把要插入的當(dāng)成哨兵 折半法找到要插入的位置high=m-1;插入位置后的袁術(shù)后移一位插入元素/BiI nserti on sort/*快速交換排序法*/int Partition(Sqlist &L,int low,int high)int pivotkey;L.r0.Key=L.rlow.Key; /用子表的第一個(gè)記錄作樞軸記錄pivotkey=L.rlow.Key
7、; /樞軸記錄關(guān)鍵字while(low<high) / 從表的兩端交替地向中間掃描while(low<high&&L.rhigh.Key>=pivotkey)-high;/ 將比樞軸記錄小的記錄移到低端/whileL.rlow.Key=L.rhigh.Key; while(low<high&&L.rlow.Key<=pivotkey) +low;將比樞軸記錄大的記錄移到高端/whileL.rhigh.Key=L.rlow.Key;/whileL.rlow.Key=L.r0.Key;樞軸記錄到位return low;/返回樞軸位置/P
8、artiti onvoid QSort(Sqlist & L,i nt low,i nt high)int pivotloc;if(low<high)/長(zhǎng)度大于 1pivotloc=Partition(L,low,high);將 L.rlow highQSort(L,low,pivotloc-1);/QSort(L,pivotloc+1,high);/ /if/QSortvoid QuickSort(Sqlist &L)/QSort(L,1,L.le ngth); printf("交換排序:n”); output(L);/QuickSort/*選擇排序法*/vo
9、id SelectSort(Sqlist L)對(duì)低子表遞歸排序,pivotloc 對(duì)高子表遞歸排序?qū)樞虮鞮做快速排序分為二是樞軸位置for(i=1;i<=Len gth;i+) k=i;/要確定排序元素的位置for(j=i+1;j<=Len gth;j+)if(L.rk.Key>L.rj.Key) k=j; /temp=L.ri.Key; 輸出線性表 L L.ri.Key=L.rk.Key;L.rk.Key=temp;/forprintf("選擇排序:n”);output(L);/SelectSort若后面有更小的記錄下其位置主函數(shù)設(shè)計(jì)int mai n()Sql
10、ist L;In put(L);/BiI nserti on sort(L); /BubbleSort(L); /輸入要排的數(shù)字,創(chuàng)建線性表L對(duì)L進(jìn)行插入排序,輸出線性表L 對(duì)L進(jìn)行交換排序,輸出線性表LSelectSort(L); /對(duì)L進(jìn)行選擇排序,輸出線性表Lreturn ok;四、程序調(diào)試分析1 、由于本次實(shí)驗(yàn)中存儲(chǔ)數(shù)據(jù)的線性表是在In put函數(shù)中進(jìn)行的,所以開(kāi)始時(shí)忘了將l.length 初始化,出現(xiàn)報(bào)錯(cuò),開(kāi)始我直接在定義線性表的結(jié)構(gòu)中賦值為MAXSIZE還是有問(wèn)題,原來(lái)是定義結(jié)構(gòu)時(shí)不能直接在內(nèi)部賦初值!通過(guò)這次錯(cuò)誤讓我對(duì)數(shù)組的用法有了一個(gè)更 深的了解,實(shí)踐后記得更深。2、對(duì)于快速排
11、序一直都不太理解,編譯時(shí)出現(xiàn)了各種報(bào)錯(cuò)提示,后來(lái)我又回頭仔仔細(xì)細(xì)的看了書(shū)上的內(nèi)容, 重新理解快排的算法思想,先設(shè)置樞軸,進(jìn)行一趟簡(jiǎn)單的分大小, 再進(jìn)行遞歸調(diào)用,直到排序結(jié)束,重新寫了一遍程序,調(diào)試了幾次就成功了,對(duì)于快排有了一個(gè) 較深的把握與理解。3、一直對(duì)于快排的交換環(huán)節(jié)存有疑慮,當(dāng)出現(xiàn)第一個(gè)比樞軸小的關(guān)鍵字時(shí)就進(jìn)行這句L.rlow.Key=L.rhigh.Key;原以為這樣后low空間里的關(guān)鍵字被換成了 high的了,那low里的關(guān)鍵字就缺失了,但是調(diào)試卻沒(méi)有問(wèn)題,經(jīng)過(guò)單步運(yùn)行后,發(fā)現(xiàn)原來(lái)low里的為樞軸量,放在了首單元地址里,后來(lái)又換回來(lái)了,所以沒(méi)有缺失。4、在選擇排序中,剛開(kāi)始我的程序
12、是比較后就直接交換的,后來(lái)看書(shū)上是記住數(shù)組的下標(biāo)全部比較后進(jìn)行一次交換就可以了,少了不少的交換次數(shù),效率提高了不少,讓我看到了優(yōu)化程序的重要性,在實(shí)現(xiàn)的基礎(chǔ)上不斷地去優(yōu)化程序,讓程序變得更好。五、用戶使用說(shuō)明1、本程序的運(yùn)行環(huán)境為DOS操作系統(tǒng),執(zhí)行文件為:排序.exe。2、進(jìn)入程序后,輸入所需排序的十個(gè)整數(shù),回車運(yùn)行程序。3、程序運(yùn)行后即在屏幕上輸出計(jì)算結(jié)果。六、程序運(yùn)行結(jié)果叵 *D:Program Files (x86)Vni<rosoft visual c+ + MSDc-v98MyProjcct1cpp4 1010073473 4475773344757733447577395
13、10096 1009S 10012 34 57 99 21折半插入排序:41012 Z1交換排序,1 IQ 1221孫擇舟£序=41012 Z1Press anyto conti_n ue'D:Pragram File (xfiSmicnQSQFt visual c+MSDev5SMyProj21 3 34 1 54 3 67 54 10U 45 卅半插入排序二133213445545467100交按排序:1332124455454詵擇排序:13321344554546?1QQFress on歲 k&y to continue七、程序清單#i nclude"
14、stdio.h"/*宏定義*/#defi ne KeyType int#defi ne MAXSIZE 10#defi ne ok 1#defi ne error 0 /*順序存儲(chǔ)結(jié)構(gòu)*/typedef structKeyType Key; RedType;typedef structRedType rMAXSIZE+1;in t le ngth;/ =MAXSIZE; Sqlist;/*輸入數(shù)據(jù)*/in tin put(Sqlist & L)for(int i=1;i<=MAXSIZE;i+)scan f("%d",&L.ri.Key);L
15、.le ngth=MAXSIZE;return ok;/*輸出排好的數(shù)字*/in t output(Sqlist L)for(int i=1;i<=MAXSIZE;i+)prin tf("%-4d",L.ri.Key);prin tf("n");return ok;/*折半插入排序法*/void Bii nserti on sort (Sqlist L)int i,j,low,high,m;for(i=2;i<=Len gth;i+)L.rO.Key=L.ri.Key; /把要插入的當(dāng)成哨兵low=1; high=i-1;while(low&
16、lt;=high)II折半法找到要插入的位置m=(low+high)I2;if(L.rO.Key<L.rm.Key) high=m-1;else low=m+1;for(j=i-1;j>=high+1;j-) II插入位置后的袁術(shù)后移一位L.rj+1=L.rj;L.rhigh+1=L.rO; II插入元素IIlowprintf("折半插入排序:n");output(L);IIBii nserti on sortI*快速交換排序法*Iint Partition(Sqlist &L,int low,int high)int pivotkey;L.r0.Key
17、=L.rlow.Key;用子表的第一個(gè)記錄作樞軸記錄pivotkey=L.rlow.Key;樞軸記錄關(guān)鍵字while(low<high)從表的兩端交替地向中間掃描while(low<high&&L.rhigh.Key>=pivotkey)-high;/將比樞軸記錄小的記錄移到低端/whileL.rlow.Key=L.rhigh.Key;while(low<high&&L.rlow.Key<=pivotkey)+low;將比樞軸記錄大的記錄移到高端/whileL.rhigh.Key=L.rlow.Key;/whileL.rlow.Ke
18、y=L.r0.Key;樞軸記錄到位return low;/ 返回樞軸位置/Partitio n void QSort(Sqlist &L,int low,int high) int pivotloc;if(low<high)/長(zhǎng)度大于 1分為二是樞軸位置pivotloc=Partitio n(L,low,high);QSort(L,low,pivotloc-1);QSort(L,pivotloc+1,high);將 L.rlow high-對(duì)低子表遞歸排序,pivotloc 對(duì)高子表遞歸排序?qū)樞虮鞮做快速排序要確定排序元素的位置/if/QSortvoid QuickSort(Sqlist &L)/QSort(L,1, L.le ngth); printf("交換排序:n");output(L);/QuickSort/*選擇排序法*/void SelectSort(Sqlist L)int i,j,k,temp;for(i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 七級(jí)地理測(cè)試題及答案
- 肝功能相關(guān)生化檢驗(yàn)考核試題及答案
- 上海一家人逆市營(yíng)銷案例分享
- 2025年有機(jī)肥料及微生物肥料項(xiàng)目建議書(shū)
- 司機(jī)職責(zé)培訓(xùn)
- 高管股權(quán)激勵(lì)行權(quán)協(xié)議書(shū)(含稅務(wù)籌劃及分紅條款)
- 文化節(jié)慶活動(dòng)宣傳推廣合同
- 食品安全監(jiān)管維護(hù)補(bǔ)充合同
- 濱海棧道防腐木結(jié)構(gòu)安裝與保養(yǎng)合作協(xié)議
- 生物制藥專利技術(shù)許可與知識(shí)產(chǎn)權(quán)保護(hù)合同
- SketchUp (草圖大師) 基礎(chǔ)培訓(xùn)PPT課件
- 病歷書(shū)寫基本規(guī)范12021病歷書(shū)寫規(guī)范試題.doc
- 《山東省自然科學(xué)基金資助項(xiàng)目年度進(jìn)展報(bào)告》
- 生命線安裝方案
- 電廠保安人員管理制度
- ge核磁共振機(jī)房專用精密空調(diào)機(jī)技術(shù)要求
- 發(fā)展與教育心理學(xué)個(gè)別差異
- 2022年重慶市建筑安全員A證考試近年真題匯總(含答案解析)
- 新干縣人民醫(yī)院血液透析治療患者告知書(shū)
- 沸騰爐的設(shè)計(jì)
- 模數(shù)式公路橋梁伸縮縫安裝施工工法
評(píng)論
0/150
提交評(píng)論