[size=medium][color=red]歸併排序(merge sort)[/color][/size]是利用"歸併"技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。
兩路歸併演算法
1、演算法基本思路
設兩個有序的子檔案(相當於輸入堆)放在同一向量中相鄰的位置上:r[low..m],r[m+1..high],先將它們合併到乙個區域性的暫存向量r1(相當於輸出堆)中,待合併完成後將r1複製回r[low..high]中。
(1)合併過程
合併過程中,設定i,j和p三個指標,其初值分別指向這三個記錄區的起始位置。合併時依次比較r[i]和r[j]的關鍵字,取關鍵字較小的記錄複製到r1[p]中,然後將被複製記錄的指標i或j加1,以及指向複製位置的指標p加1。
重複這一過程直至兩個輸入的子檔案有乙個已全部複製完畢(不妨稱其為空),此時將另一非空的子檔案中剩餘記錄依次複製到r1中即可。
(2)動態申請r1
實現時,r1是動態申請的,因為申請的空間可能很大,故須加入申請空間是否成功的處理。
2、歸併演算法
void merge(seqlist r,int low,int m,int high)
//merge
2、自頂向下的方法
採用分治法進行自頂向下的演算法設計,形式更為簡潔。
(1)分治法的三個步驟
設歸併排序的當前區間是r[low..high],分治法的三個步驟是:
①分解:將當前區間一分為二,即求**點
②求解:遞迴地對兩個子區間r[low..mid]和r[mid+1..high]進行歸併排序;
③組合:將已排序的兩個子區間r[low..mid]和r[mid+1..high]歸併為乙個有序的區間r[low..high]。
遞迴的終結條件:子區間長度為1(乙個記錄自然有序)。
(2)具體演算法
void mergesortdc(seqlist r,int low,int high)
else while(i<=m)
p=0;
for(i=low;i<=high;i++)
}void mergepass(int ,int length,int n)
//歸併最後兩個子檔案
//注意:若i≤n且i+length-1≥n時,則剩餘乙個子檔案輪空,無須歸併
//mergepass
void mergesort(int ,int n)
資料結構 歸併排序
排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...
資料結構 歸併排序
歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...
資料結構 歸併排序!!!
歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...