資料結構之歸併排序

2021-08-26 12:52:20 字數 1437 閱讀 9780

//編寫乙個歸併排序程式,並在main函式中驗證結果

/**歸併排序(merging sort)是利用「歸併」技術進行排序,所謂歸併

*是指將若干個已排序好的子表合併成乙個有序表

*最簡單的歸併是將兩個有序的子表合併成乙個有序表。假設r[low]

*到r[mid]和r[mid+1]到r[high]是儲存在同乙個陣列中且相鄰的兩個有序表

*要將它們合併為乙個有序表r1[low]到r1[high],只要設定3個指示器i,j和k,

*其初值分別是這3個記錄區的起始位置。合併時依次比較r[i]和r[j]的關鍵字,

*取關鍵字較小的記錄複製到r1[k]中,然後,將指向複製記錄的指示器加1和

*指向複製位置的指示器加1,重複這一過程,直到全部記錄都複製如r1[low]

*到r1[high]中為止。

*下面給出二路歸併排序的全過程:

*初始關鍵字: 49 38 65 97 76 13 49'

*初始子表: [49][38] [65] [97] [76] [13] [49']

*第一趟歸併後:[38 49][65 97] [13 76] [49']

*第二趟歸併後:[38 49 65 97] [13 49' 76]

*第三趟歸併後:[13 38 49 49' 65 76 97]

*///**清單如下:

#includeusing namespace std;

const int maxsize=100; //排序表容量,假設為100

typedef int datatype;

typedef struct

rectype; //記錄表型別

typedef rectype list[maxsize]; //排序表型別,0號單元不用

//兩個有序表合併成乙個有序序列

void merge(list r,list r1,int low,int mid,int high)

//記錄後移

else

while(i<=mid) r1[k++]=r[i++]; //若左子表合併完,複製剩餘記錄

while(j<=high) r1[k++]=r[j++]; //若右子表合併完,複製剩餘記錄

}//一趟歸併問題

void mergepass(list r,list r1,int n,int len)

if(i+len-1>r[i].key ;

cout

cout

cout<<"最後排序結果為:"

cout

return 0;

}

資料結構之歸併排序

介紹 歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實現的歸併排序首先進行是兩兩歸...

資料結構之歸併排序

話說天下大勢,分久必合,合久必分.那就讓我一統江山,將其合併吧 哇咔咔咔,廢話不多說了,歸併排序的 來啦.歸併畢竟相較之前的排序都會更複雜些,所以加了備註.寫注釋也是能獲得碼市好好公民獎的吧 public class merge 以起始下標和最大下標為準求出中間數,採用遞迴方式將陣列不斷分成左右兩邊...

資料結構之排序 歸併排序

四 歸併排序 歸併 把若干個有序的數列,合成乙個有序的數列 如二路歸併 void merge int d1,int len1,int d2,int len2,int tmp while i len1 tmp k d1 i while j len2 tmp k d2 j 1,二路歸併排序 迭代法 把待...