1.分治法
插入排序使用增量法:在排好的A[1],A[2],...,A[j - 1]子數組後(A[1]爲第一個元素),將A[j]插入,形成排好的子數組A[1],A[2],...,A[j]。
分治法是解決遞歸問題的一種策略:將原問題分成n個規模較小而結構與原問題相似的子問題,遞歸地解決這些子問題,然後再合併這些結果,得到原問題的解。
分治法在每層遞歸上都分爲三步:
分解:將原問題分爲一系列子問題
解決:遞歸地解決各子問題,如果子問題足夠小,則直接解決
合併:將子問題的結果合併成原問題的解
2.合併排序
A是一個無序數組,p, q, r是其三個下標,且r > q > p;將元素p到q - p + 1與q到r合併排序的方法爲:
MERGE(A, p, q ,r)
int n1 = q - p + 1;
int n2 = r - q;
int L[n1],R[n2];
for(i = 1; i <= n1; i++)
{
L[i] = A[p + i - 1];
}
for(i = 1; i < n2; i++)
{
R[i] = A[q + i];
}
int l = 1, r = 1;
for(i = 1; i <= n1 + n2 && l <= n1 && r <= n2; i++)
{
if( L[l] < R[r] )
{
A[p + i -1] = L[l];
l++;
}
if( L[l] > R[r] )
{
A[p + i - 1] = R[r];
r++;
}
}
while( l <= n1 )
{
A[p + i -1] = L[l];
l++;
}
while( l <= n2 )
{
A[p + i -1] = R[r];
r++;
}
3.分治法
思路:
將n個元素分成2組,每組有元素n/2(這裏先假設n是偶數)
用合併排序分別對兩個子序列遞歸地排序(也可以用其他方法解決子問題,如插入法,冒泡法)
合併兩個已排好的序列,形成原序列的解
現在可以用MERGE(A, p, q ,r)方法來完成一個完整的排序方案
MERGER-SORT(A, p, r)
if(p < r)
{
q = (r + p)/2;
MERGER-SORT(A, p, q);
MERGER-SORT(A, q + 1, r);
MERGE(A, p, q ,r)
}
整個方法的運行時間是n*log2(n)。