在實現上有三個操作:
分解,將待排序的n個元素的序列分解成兩個n/2元素的子串行;
解決,使用歸併排序遞迴排序子串行;
合併,合併兩個已排序的子串行。
歸併排序演算法的關鍵操作是合併步驟中兩個已排序序列的合併。
其中a是陣列,p、q、r是陣列下標,滿足p<=q
//合併
merge(a, p, q, r)
n1 = q - p + 1
n2 = r - q
let l[1..n1 + 1] and r[1..n2 + 1] be new arrays
for i = 1
to n1
l[i] = a[p + i - 1]
for j = 1
to n2
r[j] = a[q + j]
l[n1 + 1] = ∞
r[n2 + 1] = ∞
i = 1
j = 1
for k = p to r
if l[i] <= r[j]
a[k] = l[i]
i = i + 1
else
a[k] = r[j]
j = j + 1
//排序演算法(q向下取整)
merge-sort(a, p, r)
if p < r
q = (p + r) / 2
merge-sort(a, p, q)
merge-sort(a, q + 1, r)
merge(a, p, q, r)
public
static
void merge(int queue, int p, int q, int r) else
}while (i <= j)
while (m <= n)
system.arraycopy(temp, 0, queue, p, temp.length);
}public
static
void mergesort(int queue, int p, int r)
}
1、設數列長為n,將數列分開成小數列一共要logn步,每步都是乙個合併有序數列的過程,時間複雜度可以記為o(n),故一共為o(n*logn)。
2、因為歸併排序每次都是在相鄰的資料中進行操作,所以歸併排序在o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)也是效率比較高的。
3、歸併的空間複雜度就是那個臨時的陣列和遞迴時壓入棧的資料占用的空間:n + logn;所以空間複雜度為:o(n)。
以上,就是筆者對於歸併排序的初略見解。
演算法基礎 歸併排序
1.演算法描述 把原始的陣列分成若干的子陣列,對每乙個子陣列進行排序 繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完成,形成有序的陣列。2.演算法實現 2.1.合併子陣列 param unsorted the unsorted array param first the start ind...
演算法基礎 歸併排序
歸併排序即將目標陣列分成n個最小的組 相鄰的2個數字 並將這些最小子陣列排序,依次合併相鄰的子陣列,最後各自有序的子陣列將會合併成完全有序的陣列。這將需要用到遞迴思想。static class mergesort private static void merge int a,int start,i...
基礎演算法 歸併排序
def merge arr 這個函式是先把陣列進行分割,一直分,最後分成乙個數來呼叫第二個函式mergesort進行比較 如果陣列只有乙個數,直接就返回 if len arr 1 return arr mid len arr 2 left arr merge arr mid right arr me...