實驗四-排序-實驗報告_第1頁
實驗四-排序-實驗報告_第2頁
實驗四-排序-實驗報告_第3頁
實驗四-排序-實驗報告_第4頁
實驗四-排序-實驗報告_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗四-排序-實驗報告1/2數(shù)據(jù)結構實驗報告實驗名稱:實驗四排序學生姓名:班級:班內序號:學號:日期:2012年12月21日實驗要求題目2使用鏈表實現(xiàn)下面各種排序算法,并進行比較。排序算法:1、插入排序2、冒泡排序3、快速排序4、簡單選擇排序5、其他要求:1、測試數(shù)據(jù)分成三類:正序、逆序、隨機數(shù)據(jù)。2、對于這三類數(shù)據(jù),比較上述排序算法中關鍵字的比較次數(shù)和移動次數(shù)(其中關鍵字交換計為3次移動)。實驗四-排序-實驗報告全文共19頁,當前為第1頁。3、對于這三類數(shù)據(jù),比較上述排序算法中不同算法的執(zhí)行時間,精確到微秒(選作)。實驗四-排序-實驗報告全文共19頁,當前為第1頁。4、對2和3的結果進行分析,驗證上述各種算法的時間復雜度。編寫測試main()函數(shù)測試線性表的正確性.2、程序分析2.1存儲結構說明:本程序排序序列的存儲由鏈表來完成.其存儲結構如下圖所示。(1)單鏈表存儲結構:結點地址:1000HA[2]結點地址:1000H1080H……頭指針地址:1020HA[0]頭指針地址:1020H10C0H……地址:1080HA[3]地址:1080HNULL……地址:10C0HA[1]地址:10C0H1000H……(2)結點結構structNode實驗四-排序-實驗報告全文共19頁,當前為第2頁。{實驗四-排序-實驗報告全文共19頁,當前為第2頁。?intdata;?Node*next;};示意圖:intdataNode*next intdataNode*next2。2關鍵算法分析一:關鍵算法(一)直接插入排序voidLinkSort::InsertSort()直接插入排序是插入排序中最簡單的排序方法,其基本思想是:依次將待排序序列中的每一個記錄插入到一個已排好的序列中,直到全部記錄都排好序。(1)算法自然語言1.將整個待排序的記錄序列劃分成有序區(qū)和無序區(qū),初始時有序區(qū)為待排序記錄序列中的第一個記錄,無序區(qū)包括所有剩余待排序的記錄;2.將無須去的第一個記錄插入到有序區(qū)的合適位置中,從而使無序區(qū)減少一個記錄,有序區(qū)增加一個記錄;3。重復執(zhí)行2,直到無序區(qū)中沒有記錄為止。(2)源代碼voidLinkSort::InsertSort() ?//從第二個元素開始,尋找前面那個比它大的{實驗四-排序-實驗報告全文共19頁,當前為第3頁。?Node*P=front->next; ?//要插入的節(jié)點的前驅實驗四-排序-實驗報告全文共19頁,當前為第3頁。?while(P—>next) {? Node*S=front;??//用來比較的節(jié)點的前驅 ?while(1)? {???CompareCount++; ??if(P—〉next->data〈S—〉next->data) ?//P的后繼比S的后繼小則插入 ?{?? ?insert(P,S); break; ? } ??S=S—>next; ??if(S==P) ? ? ?//若一趟比較結束,且不需要插入? ?{? ?P=P-〉next;實驗四-排序-實驗報告全文共19頁,當前為第4頁。 ?? break;}實驗四-排序-實驗報告全文共19頁,當前為第4頁。??}?}}(3)時間和空間復雜度最好情況下,待排序序列為正序,時間復雜度為O(n)。最壞情況下,待排序序列為逆序,時間復雜度為O(n2)。直接插入排序只需要一個記錄的輔助空間,用來作為待插入記錄的暫存單元和查找記錄的插入位置過程中的“哨兵”。直接插入排序是一種穩(wěn)定的排序方法.直接插入排序算法簡單容易實現(xiàn),當序列中的記錄基本有序或帶排序記錄較少時,他是最佳的排序方法。但當待排序的記錄個數(shù)較多時,大量的比較和移動操作使直接插入排序算法的效率減低。rr1≤r2≤……≤ri-1riri+1……rn有序區(qū)無序區(qū)直接插入排序的基本思想插入到合適位置直接插入排序過程直接插入排序過程初始鍵值序列[12]1592063124第一趟排序結果[1215]92063124第二趟排序結果[91215]2063124第三趟排序結果[9121520]63124第四趟排序結果[69121520]3124第五趟排序結果[6912152031]24第六趟排序結果[691215202431]實驗四-排序-實驗報告全文共19頁,當前為第5頁。實驗四-排序-實驗報告全文共19頁,當前為第5頁。(二)冒泡排序voidLinkSort::BubbleSort()冒泡排序是交換排序中最簡單的排序方法,其基本思想是:兩兩比較相鄰記錄的關鍵碼,如果反序則交換,直到沒有反序的記錄為止。本程序采用改進的冒泡程序。(1)算法自然語言1。將整個待排序的記錄序列劃分成有序區(qū)和無序區(qū),初始狀態(tài)有序區(qū)為空,無序區(qū)包括所有待排序的記錄.2.對無序區(qū)從前向后依次將相鄰記錄的關鍵碼進行比較,若反序則交換,從而使得關鍵碼小的記錄向前移,關鍵碼大的記錄向后移(像水中的氣泡,體積大的先浮上來)。3。將最后一次交換的位置pos,做為下一趟無序區(qū)的末尾.4。重復執(zhí)行2和3,直到無序區(qū)中沒有反序的記錄。(2)源代碼voidLinkSort::BubbleSort(){?Node*P=front—〉next; 實驗四-排序-實驗報告全文共19頁,當前為第6頁。?while(P->next)?//第一趟排序并查找無序范圍實驗四-排序-實驗報告全文共19頁,當前為第6頁。 {? CompareCount++;? if(P-〉dat(yī)a>P—>next-〉data)?? swap(P,P-〉next);? P=P->next; }?Node*pos=P; P=front-〉next; while(pos!=front-〉next)?{??Node*bound=pos; ?pos=front->next; while(P->next?。剑鈕und)??{? CompareCount++;? if(P->data>P—>next—〉data)實驗四-排序-實驗報告全文共19頁,當前為第7頁。???{實驗四-排序-實驗報告全文共19頁,當前為第7頁。 ? ?swap(P,P—>next);?? pos=P->next;?? }? P=P->next; ?? ?} P=front->next; }}(3)時間和空間復雜度在最好情況下,待排序記錄序列為正序,算法只執(zhí)行了一趟,進行了n-1次關鍵碼的比較,不需要移動記錄,時間復雜度為O(n);在最壞情況下,待排序記錄序列為反序,時間復雜度為O(n2),空間復雜度為O(1). 冒泡排序是一種穩(wěn)定的排序方法.rrjrj+1ri+1≤……≤rn-1≤rn無序區(qū)有序區(qū)1≤j≤i-1已經位于最終位置起泡排序的基本思想反序則交換初始鍵值序列初始鍵值序列[5013559727384965]第一趟排序結果[13505527384965]97第二趟排序結果[1350273849]556597第三趟排序結果[13273849]50556597第四趟排序結果1327384950556597冒泡排序過程實驗四-排序-實驗報告全文共19頁,當前為第8頁。實驗四-排序-實驗報告全文共19頁,當前為第8頁。(三)快速排序voidLinkSort::Qsort()(1)算法自然語言1.首先選一個軸值(即比較的基準),將待排序記錄分割成獨立的兩部分,左側記錄的關鍵碼均小于或等于軸值,右側記錄的關鍵碼均大于或等于軸值。2.然后分別對這兩部分重復上述過程,直到整個序列有序。3。整個快速排序的過程遞歸進行。(2)源代碼voidLinkSort::Qsort(){ Node*End=front;?while(End->next) {??End=End->next; } Partion(front,End);}voidLinkSort::Partion(Node*Start,Node*End)實驗四-排序-實驗報告全文共19頁,當前為第9頁。{實驗四-排序-實驗報告全文共19頁,當前為第9頁。?if(Start—〉next==End||Start==End)?? //遞歸返回??return;?Node*Mid=Start;??//基準值前驅?Node*P=Mid->next;?while(P!=End&&P!=End->next) { CompareCount++;? if(Mid->next-〉dat(yī)a>P-〉next->data)?//元素值小于軸點值,則將該元素插在軸點之前 ?{? ?if(P—>next==End)?? //若該元素為End,則將其前驅設為End ? End=P; ??insert(P,Mid); ?Mid=Mid->next;? }? elseP=P—>next; }實驗四-排序-實驗報告全文共19頁,當前為第10頁。?Partion(Start,Mid);?//遞歸處理基準值左側鏈表實驗四-排序-實驗報告全文共19頁,當前為第10頁。 Partion(Mid-〉next,End);?//遞歸處理基準值右側鏈表}(3)時間和空間復雜度在最好的情況下,時間復雜度為O(nlog2n)。在最壞的情況下,時間復雜度為O(n2)。 快速排序是一種不穩(wěn)定的排序方法.[[r1……ri-1]ri[ri+1……rn]均≤ri軸值均≥ri位于最終位置快速排序的基本思想圖解(四)簡單選擇排序基本思想為:第i趟排序通過n-i次關鍵碼的比較,在n—i+1(1≤i≤n—1)各記錄中選取關鍵碼最小的記錄,并和第i個記錄交換作為有序序列的第i個記錄。(1)算法自然語言1.將整個記錄序列劃分為有序區(qū)和無序區(qū),初始狀態(tài)有序區(qū)為空,無序區(qū)含有待排序的所有記錄。2.在無序區(qū)中選取關鍵碼最小的記錄,將它與無序區(qū)中的第一個記錄交換,使得有序區(qū)擴展了一個記錄,而無序區(qū)減少了一個記錄。3。不斷重復2,直到無序區(qū)之剩下一個記錄為止。實驗四-排序-實驗報告全文共19頁,當前為第11頁。(2)源代碼實驗四-排序-實驗報告全文共19頁,當前為第11頁。voidLinkSort::SelectSort(){?Node*S=front; while(S—>next—〉next)?{??Node*P=S; ?Node*Min=P; while(P—〉next)//查找最小記錄的位置??{ ??CompareCount++; ?if(P—〉next—>data〈Min->next->data)? ??Min=P; ? P=P-〉next;??}??insert(Min,S); S=S—>next;?}}實驗四-排序-實驗報告全文共19頁,當前為第12頁。實驗四-排序-實驗報告全文共19頁,當前為第12頁。(3)時間和空間復雜度簡單選擇排序最好、最壞和平均的時間復雜度為O(n2)。簡單選擇排序是一種不穩(wěn)定的排序方法.初始鍵值序列初始鍵值序列[49276597761338]第一趟排序結果13[276597764938]第二趟排序結果1327[6597764938]第三趟排序結果132738[97764965]第四趟排序結果13273849[769765]第五趟排序結果1327384965[9776]第六趟排序結果13273849657697簡單選擇排序的過程示例(五)輸出比較結果函數(shù)(含計算函數(shù)體執(zhí)行時間代碼)(1)算法自然語言1、依次調用直接插入排序、冒泡排序、快速排序、簡單選擇排序的函數(shù)體,進行序列的排序,并輸出相應的比較次數(shù)、移動次數(shù)。2、獲取當前系統(tǒng)時間。在調用函數(shù)之前設定一個調用代碼前的時間,在調用函數(shù)之后再次設定一個調用代碼后的時間,兩個時間相減就是代碼運行時間。說明:運用QueryPerformanceFrequency()可獲取計時器頻率;QueryPerformanceCounter()用于得到高精度計時器的值。實驗四-排序-實驗報告全文共19頁,當前為第13頁。實驗四-排序-實驗報告全文共19頁,當前為第13頁。(2)源代碼voidprintResult(LinkSort&a,LinkSort&b,LinkSort&c,LinkSort&d){ _LARGE_INTEGERtime_start;//開始時間_LARGE_INTEGERtime_over;//結束時間doubledqFreq;//計時器頻率LARGE_INTEGERf;//計時器頻率QueryPerformanceFrequency(&f);dqFreq=(double)f。QuadPart;a.print();doubleTimeCount;?CompareCount=0;MoveCount=0;TimeCount=0; QueryPerformanceCounter(&time_start);//記錄起始時間?a.InsertSort();?QueryPerformanceCounter(&time_over);//記錄結束時間 TimeCount=((time_over.QuadPart-time_start.QuadPart)/dqFreq)*1000000;實驗四-排序-實驗報告全文共19頁,當前為第14頁。 cout〈<”排序結果:";a.print();實驗四-排序-實驗報告全文共19頁,當前為第14頁。 cout<<"1。插入。比較次數(shù):”〈〈setw(3)<<CompareCount〈<";移動次數(shù):”<<setw(3)〈<MoveCount〈<";時間:"<<TimeCount<〈"us"<<endl; CompareCount=0;MoveCount=0;TimeCount=0; QueryPerformanceCounter(&time_start);//記錄起始時間?b.BubbleSort(); QueryPerformanceCounter(&time_over);//記錄結束時間?TimeCount=((time_over.QuadPart-time_start。QuadPart)/dqFreq)*1000000; cout〈〈"2.冒泡.比較次數(shù):”<<setw(3)<〈CompareCount<〈";移動次數(shù):"<<setw(3)<<MoveCount<〈”;時間:"〈〈TimeCount<〈"us"<〈endl; CompareCount=0;MoveCount=0;TimeCount=0; QueryPerformanceCounter(&time_start);//記錄起始時間?c.Qsort();?QueryPerformanceCounter(&time_over);//記錄結束時間實驗四-排序-實驗報告全文共19頁,當前為第15頁。?TimeCount=((time_over。QuadPart-time_start。QuadPart)/dqFreq)*1000000;實驗四-排序-實驗報告全文共19頁,當前為第15頁。 cout<〈"3??焖佟1容^次數(shù):"<〈setw(3)〈〈CompareCount<〈";移動次數(shù):"<<setw(3)〈<MoveCount〈<";時間:”<<TimeCount〈<"us"<<endl;?CompareCount=0;MoveCount=0;TimeCount=0; QueryPerformanceCounter(&time_start);//記錄起始時間?d.SelectSort();?QueryPerformanceCounter(&time_over);//記錄結束時間?TimeCount=((time_over.QuadPart-time_start。QuadPart)/dqFreq)*1000000;?cout<〈”4。選擇。比較次數(shù):”<<setw(3)<<CompareCount<<”;移動次數(shù):”〈<setw(3)〈<MoveCount<〈”;時間:"〈<TimeCount〈<”us"<<endl;}(3)時間和空間復雜度時間復雜度O(1)(因為不包含循環(huán)體)。實驗四-排序-實驗報告全文共19頁,當前為第16頁。2。3其他實驗四-排序-實驗報告全文共19頁,當前為第16頁。排序方法平均情況最好情況最壞情況輔助空間直接插入排序O(n2)O(n)O(n2)O(1)希爾排序O(nlog2n)~O(n2)O(n1。3)O(n2)O(1)起泡排序O(n2)O(n)O(n2)O(1)快速排序O(nlog2n)O(nlog2n)O(n2)O(log2n)~O(n)簡單選擇排序O(n2)O(n2)O(n2)O(1)堆排序O(nlog2n)O(nlog2n)O(nlog2n)O(1)歸并排序O(nlog2n)O(nlog2n)O(nlog2n)O(n)3、程序運行結果(1)程序流程圖開始開始輸入數(shù)據(jù)輸入數(shù)據(jù)順序數(shù)組

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論