排序------------------分治策略与组合法

来源:互联网 发布:怎样在淘宝上卖二手货 编辑:程序博客网 时间:2024/04/30 10:03
 

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