排序------------------分治策略與組合法

 

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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章