




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、排序問題求解實(shí)驗(yàn)報(bào)告1、 算法的基本思想1、直接插入排序算法思想 直接插入排序的基本思想是將一個(gè)記錄插入到已排好序的序列中,從而得到一個(gè)新的,記錄數(shù)增 1 的有序序列。 直接插入排序算法的偽代碼稱為 InsertionSort,它的參數(shù)是一個(gè)數(shù)組 A1.n,包含了 n個(gè)待排序的數(shù)。用偽代碼表示直接插入排序算法如下:InsertionSort (A)for i2 to ndo keyAi /key 表示待插入數(shù)/Insert Ai into the sorted sequence A1.i-1ji-1while j>0 and Aj>keydo Aj+1Ajjj-1Aj+1key2、
2、 快速排序算法思想 快速排序算法的基本思想是,通過一趟排序?qū)⒋判蛐蛄蟹指畛瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。 假設(shè)待排序序列為數(shù)組 A1.n,首先選取第一個(gè)數(shù) A0,作為樞軸(pivot),然后按照下述原則重新排列其余數(shù):將所有比 A0大的數(shù)都排在它的位置之前,將所有比 A0小的數(shù)都排在它的位置之后,由此以 A0最后所在的位置 i 作為分界線,將數(shù)組 A1.n分成兩個(gè)子數(shù)組 A1.i-1和 Ai+1.n。這個(gè)過程稱作一趟快速排序。通過遞歸調(diào)用快速排序,對(duì)子數(shù)組A1.i-1和 Ai+1.n排序。 一趟快速排序算法
3、的偽代碼稱為 Partition,它的參數(shù)是一個(gè)數(shù)組 A1.n和兩個(gè)指針 low、high,設(shè)樞軸為 pivotkey,則首先從 high 所指位置起向前搜索,找到第一個(gè)小于pivotkey 的數(shù),并將其移到低端,然后從 low 所指位置起向后搜索,找到第一個(gè)大于 pivotkey 的數(shù),并將其移到高端,重復(fù)這兩步直至 low=high。最后,將樞軸移到正確的位置上。用偽代碼表示一趟快速排序算法如下:Partition ( A, low, high)A0Alow/用數(shù)組的第一個(gè)記錄做樞軸記錄privotkeyAlow/樞軸記錄關(guān)鍵字while low<high /從表的兩端交替地向中間掃
4、描while low<high && Ahigh>=privotkey do highhigh-1AlowAhigh /將比樞軸記錄小的記錄移到低端while low<high && Alow<=pivotkey) do lowlow+11 / 12AhighAlow /將比樞軸記錄大的記錄移到高端AlowA0 /樞軸記錄到位return low /返回樞軸位置2、 算法的理論分析1. 直接插入排序算法理論分析從空間來看,直接插入排序只需要一個(gè)數(shù)的輔助空間;從時(shí)間來看,直接插入排序的基本操作為:比較兩個(gè)關(guān)鍵字的大小和移動(dòng)記錄。先分析一趟直
5、接插入排序的情況。偽代碼InsertionSort 中 while 循環(huán)的次數(shù)取決于待插入的數(shù)與前 i-1 個(gè)數(shù)之間的關(guān)系。若 Ai<A0,則在 while 循環(huán)中,待插入數(shù)需與有序數(shù)組 A1.i-1中 i-1 個(gè)數(shù)進(jìn)行比較,并將 Ai-1中 i-1 個(gè)數(shù)后移。則在整個(gè)排序過程(進(jìn)行 n-1 趟插入排序)中,當(dāng)待排序數(shù)組中數(shù)按非遞減有序排列時(shí),則需進(jìn)行數(shù)間比較次數(shù)達(dá)最小值 n-1,數(shù)不需要移動(dòng);反之,當(dāng)待排序數(shù)組中數(shù)按非遞增有序排列時(shí),總的比較次數(shù)達(dá)最大值(n+2)(n-1)/2,數(shù)移動(dòng)的次數(shù)也達(dá)到最大值(n+4)(n-1)/2。若待排序數(shù)組是隨機(jī)的,即待排序數(shù)組中的數(shù)可能出現(xiàn)的各種排序
6、的概率相同,則我們可取上述最小值和最大值的平均值,作為直接插入排序時(shí)所需進(jìn)行數(shù)間的比較次數(shù)和數(shù)的移動(dòng)次數(shù),約為 n2/4。因此直接插入排序算法,在最佳情況下的時(shí)間復(fù)雜度是 O(n),在最壞情況下的時(shí)間復(fù)雜度為 O(n2)。2. 快速排序算法理論分析下面我們來分析快速排序的平均時(shí)間性能。 假設(shè) T(n)為對(duì) n 個(gè)記錄 A1.n進(jìn)行快速排序所需時(shí)間,則由算法 QuickSort 可見:其中,Tpass(n)為對(duì) n 個(gè)記錄進(jìn)行一趟快速排序 Partition(A,1,n)所需的時(shí)間,從一趟快速排序算法可見,其和記錄數(shù) n 成正比,可以用 cn 表示(c 為某個(gè)常數(shù));T(k-1)和 T(n-k)
7、分別為對(duì) A1.k-1和 Ak+1.n中記錄進(jìn)行快速排序 QuickSort(A,1,k-1)和QuickSort(A,k+1,n)所需時(shí)間。假設(shè)待排序列中記錄是隨機(jī)排列的,則在一趟排序之后,k 取 1 至 n 之間任何一值的概率相同,快速排序所需時(shí)間的平均值則為Tavg(n)=knInn,其中 n 為待排序序列中記錄的個(gè)數(shù),k 為某個(gè)常數(shù)。 通常,快速排序被認(rèn)為是,在所有同數(shù)量級(jí)(O(nlogn))的排序方法中,其平均性能最好。但是,若初始記錄序列按關(guān)鍵字有序或基本有序時(shí),快速排序?qū)⑼懟癁槠鹋菖判?,其時(shí)間復(fù)雜度為 O(n2)。3、 試驗(yàn)分析1、 試驗(yàn)環(huán)境WIN 32系統(tǒng),VC6.02、 程序
8、的執(zhí)行1)由函數(shù) datagenetare()生成 20000 個(gè)在區(qū)間1,100000上的隨機(jī)整數(shù),并將隨機(jī)整數(shù)保存到數(shù)組 num,接著調(diào)用函數(shù) WriteFile()將這些數(shù)輸出到外部文件 data.txt 中。2)調(diào)用函數(shù) ReadFile()從 data.txt 中讀取數(shù)據(jù),并將其保存到數(shù)組 num1中。接著對(duì)數(shù)組 num1 進(jìn)行直接插入排序,并計(jì)算和記錄其運(yùn)行時(shí)間。最后,調(diào)用函數(shù) WriteFile()將直接插入排序的結(jié)果寫入 resultsIS.txt,并記錄運(yùn)行時(shí)間為 TimeIS。3)調(diào)用函數(shù) ReadFile()從 data.txt 中讀取數(shù)據(jù),并將其保存到數(shù)組 num2中。
9、接著對(duì)數(shù)組 num2 進(jìn)行快速排序,并計(jì)算和記錄其運(yùn)行時(shí)間。最后,調(diào)用函數(shù) WriteFile()將快速排序的結(jié)果寫入 resultsQS.txt,并記錄運(yùn)行時(shí)間為 TimeQS。3、 試驗(yàn)數(shù)據(jù)當(dāng)N=20000時(shí):當(dāng)N=30000時(shí):當(dāng)N=40000時(shí):當(dāng)N=50000時(shí):當(dāng)N=60000時(shí):當(dāng)N=70000時(shí):當(dāng)N=80000時(shí):4、 實(shí)驗(yàn)結(jié)果分析20000300004000050000600007000080000插入排序0.3250.7191.3972.1993.054.5715.46快速排序0.0030.0050.0080.010.0120.0110.013做出折線統(tǒng)計(jì)圖4、 試驗(yàn)心得
10、通過本次試驗(yàn)首先對(duì)在C+下的文件操作有了一定的深入認(rèn)識(shí),對(duì)于快速排序和插入排序的時(shí)間有了相當(dāng)清晰且一目了然的認(rèn)識(shí),并且從原理上明白了快速排序的快的原因,對(duì)各種排序算法的優(yōu)劣性有了全局的認(rèn)識(shí)!5、 實(shí)驗(yàn)代碼#include <iostream>#include <ctime>#include <cstdlib>#include <fstream>#include <string>using namespace std;const int NumS = 80000;void datagenetare(int num,int n); /產(chǎn)生
11、隨機(jī)數(shù),保存到數(shù)組numvoid WriteFile(int num,char name,int n); /輸出數(shù)組num到data.txt文件void ReadFile(int num,char name);/讀取名為name文件中的數(shù)據(jù),保存到數(shù)組numvoid QuickSort(int arr, int n);/將數(shù)組arr中數(shù)據(jù)快速排序void InsertionSort(int arr,int n);/將數(shù)組arr中數(shù)據(jù)直接插入排序int main()int *num=(int *)malloc(sizeof(int)*NumS);int *num1=(int *)malloc(s
12、izeof(int)*NumS);int *num2=(int *)malloc(sizeof(int)*NumS);clock_t start_time1,end_time1,start_time2,end_time2;double timeQS=0,timeIS=0;cout<<"Create "<<NumS<<" random numbers from 1 to 100000"<<endl;datagenetare(num,NumS); /產(chǎn)生隨機(jī)數(shù),保存到數(shù)組numWriteFile(num,&qu
13、ot;data.txt",NumS); /輸出數(shù)組到data.txt文件cout.precision(6); /設(shè)置浮點(diǎn)數(shù)的顯示精度cout.setf(ios_base:showpoint); /輸出末尾的/直接插入排序的分析ReadFile(num1,"data.txt");/讀取data.txt中的數(shù)據(jù),保存到數(shù)組num1cout<<"nInsertionSort Start .n"start_time1=clock(); /開始計(jì)時(shí)InsertionSort(num1,NumS); /直接插入排序數(shù)組num1中的數(shù)據(jù)end_t
14、ime1=clock(); /結(jié)束計(jì)時(shí)timeIS=(double)(end_time1-start_time1)/CLOCKS_PER_SEC;cout<<"The Time-comsuption in InsertionSort is "<<timeIS<<" seconds!nn" /輸出運(yùn)行時(shí)間WriteFile(num1,"resultsIS.txt",NumS); /排序后的數(shù)據(jù)輸出到resultQS.txt/輸出運(yùn)行時(shí)間timeIS到resultsIS.txtofstream ocou
15、t;ocout.open("resultsIS.txt",ios:app);if(ocout.good() /打開resultsIS.txtocout<<"nThe Time-comsuption in InsertionSort is "<<timeIS<<" secondsn"ocout.close();elsecout<<"nCan not open resultsIS.txt!n"exit(1); /異常退出/快速排序的分析ReadFile(num2,&quo
16、t;data.txt"); /讀取data.txt中的數(shù)據(jù),保存到數(shù)組num2cout<<"QuickSort Start .n"start_time2=clock(); /開始計(jì)時(shí)QuickSort(num2,NumS); /快速排序數(shù)組num中的數(shù)據(jù)end_time2=clock(); /結(jié)束計(jì)時(shí)timeQS=(double)(end_time2-start_time2)/CLOCKS_PER_SEC;cout<<"The Time-comsuption in QuickSort is "<<timeQS
17、<<" seconds:n" /輸出運(yùn)行時(shí)間WriteFile(num2,"resultsQS.txt",NumS); /排序后的數(shù)據(jù)輸出到resultQS.txt/輸出運(yùn)行時(shí)間timeQS到resultsQS.txtocout.open("resultsQS.txt",ios:app);if(ocout.good() /打開resultsIS.txtocout<<"nThe Time-comsuption in QuickSort is "<<timeQS<<&qu
18、ot; secondsn"ocout.close();elsecout<<"nCan not open resultsQS.txt!n"exit(1); /異常退出return 0;void datagenetare(int *num,int n)int i;srand(unsigned)time(0); /srand()種子發(fā)生器函數(shù),還有rand()隨機(jī)數(shù)生成器函數(shù)for(i=0;i<n;i+) /產(chǎn)生個(gè)到之間的隨機(jī)數(shù)numi=rand()%9999+1;printf("n");/將數(shù)組中的數(shù)據(jù)輸出到文件void Writ
19、eFile(int *num,char name,int n)ofstream ocout;ocout.open(name,ios:trunc);int i=0;if(ocout.fail()exit(1); /打開文件失敗,退出for(;i<n;i+)ocout<<numi<<" "if(i+1)%40=0|i=n-1) /每輸出40個(gè)數(shù),換一行ocout<<"n"ocout.close();/將文件中的數(shù)據(jù)輸入到數(shù)組void ReadFile(int *num,char name)string strLine
20、;int i=0;char achLine300;const char* pchTok;ifstream icin;icin.open(name,ios:in); /打開名為name的文件while(icin.good()int i = 0;while(getline(icin,strLine)strLine.copy(achLine,strLine.size(),0);achLinestrLine.size()='0'/每行中的元素以空格為標(biāo)識(shí)斷開轉(zhuǎn)換為int類型后存入數(shù)組pchTok = strtok(achLine, " ");while(pchTok != NULL)numi = atoi(pchTok);i+;pchTok = strtok(NULL, " ");i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 財(cái)務(wù)信息保密及第三方審計(jì)協(xié)議
- 智能辦公系統(tǒng)與辦公室裝修一體化項(xiàng)目合同
- 收養(yǎng)協(xié)議書范本范文
- 賣公司協(xié)議書范本
- 研發(fā)中心場(chǎng)地租賃保證金技術(shù)轉(zhuǎn)移轉(zhuǎn)化協(xié)議
- 創(chuàng)業(yè)公司財(cái)務(wù)總監(jiān)股權(quán)分配及風(fēng)險(xiǎn)控制聘用合同
- 河道渣土清運(yùn)協(xié)議書范本
- 美國出口貨物貨運(yùn)代理合同范本
- 機(jī)場(chǎng)擴(kuò)建征地拆遷補(bǔ)償協(xié)議書
- 企業(yè)并購重組稅務(wù)處理與咨詢服務(wù)合同
- 中國傳統(tǒng)禮儀全課件
- 新北師大版七年級(jí)下冊(cè)生物教案全冊(cè)
- 饋線自動(dòng)化-集中型饋線自動(dòng)化(配電自動(dòng)化)
- 《膽腸吻合技術(shù)》課件
- 圍手術(shù)期患者疼痛管理課件
- 2024年度-2025年度XX村第三輪土地延包工作總結(jié)
- 2025年江蘇新海連發(fā)展集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 低碳航空器結(jié)構(gòu)設(shè)計(jì)-深度研究
- 雙重預(yù)防機(jī)制建設(shè)方案
- 2025山東產(chǎn)權(quán)交易中心招聘21人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 《煤礦運(yùn)輸系統(tǒng)課件》課件
評(píng)論
0/150
提交評(píng)論