分治法,將原問題劃分成n個規模較小而結構與原問題相似的子問題;遞迴地解決這些子問題,然後再合併其結果,就能得到原問題的解。在每一層遞迴上都會有三個步驟:
分解:將原問題分解成一系列子問題;
解決:遞迴地解決各子問題,若子問題足夠小,則直接求解;
合併:將子問題的結果合併成原問題的解。
合併排序演算法完全依照了上述模式,直觀的操作如下:
分解:將n個元素分成各含n/2個元素的子串行
解決:用合併排序法將兩個子串行遞迴的排序
合併:合併兩個已排序的子串行以得到排序結果
對於子串行排序時,其長度為1時,遞迴結束。當個元素視為已排好序。
合併過程偽**:
merge(a, p, q, r)
n1=q-p+1
n2=r-q
l r =
for i=1->n1
l[i]=a[p+i-1]
for j=1>n2
r[j]=a[q+j]
l[n1+1]=infinity
r[n2+1]=infinity
for k=p->r
if l[i]<=r[i]
a[k]=l[i]
i++else
a[k]=r[j]
j++
合併排序偽**:
mergesort(a, p, r)
if p < r
q = parseint((p+r)/2)
mergesort(a, p, q)
mergesort(a,q+1,r)
merge(a,p,q,r);
js實現例項為:
var arr = [5,2,4,7,1,3,2,6];
function merge(arr, p, q, r)
for(var j = 1; j <= n2; j++)
l[n1 + 1] = infinity;
r[n2 + 1] = infinity;
i = j = 1;
for(var k = p; k <= r; k++) else
} return arr;}
function mergesort(arr, p, r) }
console.log(mergesort(arr, 0, arr.length-1));
演算法之合併排序
合併排序演算法是用分治策略實現對n個元素進行排序的演算法。基本思想 將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成要求的排好序的集合。歸併操作的工作原理如下 第一步 申請空間,使其大小為兩個已經 排序序列之和,該空間用來存放合併後的序列 第二步 設定兩...
分治演算法之合併排序
合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列 1 分解 將待排序元素分成大小大致相同的兩個子串行 2 治理 對兩個子串行進行合併排序 3 合併 將排好序的有序子串行進行合併,得到最終的有序序列 合...
演算法之合併排序 mergeSort
合併排序演算法在結構上是遞迴的,採用分治策略 就是將原有的問題劃分為 n 個規模較小但結構與原問題相似的子問題,遞迴地解決這些子問題,然後合併其結果,就得到原問題的解。合併排序的模式一般如下 1.分解 將 n 個元素分解為各含 n 2 個元素的兩個序列 2.解決 用分治排序法對兩個子串行遞迴地排序 ...