歸併排序(Merge Sort)

2021-07-27 13:25:30 字數 1984 閱讀 4545

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

歸併過程為:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第乙個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中乙個有序表取完,然後再將另乙個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。

歸併操作的工作原理如下:

1. 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

4. 重複步驟3直到某一指標超出序列尾將另一串行剩下的所有元素直接複製到合併序列尾

又如:將序列每相鄰兩個數字進行歸併操作(merge),形成floor(n/2)個序列,排序後每個序列包含兩個元素。將上述序列再次歸併,形成floor(n/4)個序列,每個序列包含四個元素。重複步驟2,直到所有元素排序完畢。

時間複雜度為o(nlogn)這是該演算法中最好、最壞和平均的時間效能。

空間複雜度為 o(n)。

比較操作的次數介於(nlogn) / 2和nlogn - n + 1。

賦值操作的次數是(2nlogn)。歸併演算法的空間複雜度為:0(n)。

歸併排序比較占用記憶體,但卻是一種效率高且穩定的演算法。

歸併排序是穩定的排序。

即相等的元素的順序不會改變。

如輸入記錄:

1(1)、3(2)、2(3)、2(4)、5(5) (括號中是記錄的關鍵字)時輸出的

1(1)、2(3)、2(4)、3(2)、5(5)中的2和2是按輸入的順序。

這對要排序資料報含多個資訊而要按其中的某乙個資訊排序,要求其它資訊盡量按輸入的順序排列時很重要,這也是它比快速排序優勢的地方。

**如下:

/**

*@author hanlin wang

*/public

class

mergesort ;

//進行歸併排序

sort(data);

//排序後,列印結果

string txt = "";

for (int i : data)

string res = txt.substring(0, txt.length()-1);

system.out.println(res);

}//歸併排序的入口

public

static

void

sort(int data)

//歸併排序

public

static

void

mergesort(int data, int low, int high)

}//歸併這一步驟

public

static

void

merge(int data, int low, int center, int high) else

}//處理剩餘的值。事實上,只會進入其中的乙個迴圈

while (low<=center)

while (mid<=high)

//將tmparr的值塞入data中,完成合併

while (tmp<=high) }}

執行結果:

1,2,3,4

歸併排序 Merge sort

merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...

歸併排序(merge sort)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...

歸併排序 Merge Sort

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...