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

原创 2012年03月21日 15:09:56
 

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

穷举组合法计算24点

分治策略实现快速排序法

说到算法,暑假就要去实习了,这时才感觉到数据结构和算法的重要性,虽然大二时候已经学过,但是基本用不到,导致现在基本忘了,现在重新拾起,重新把以前学过的和没有学过的算法都理一遍实现一遍!!! 给自己一个...

分治法-基于分之策略的归并排序和快速排序

分治法 分治法在算法结构上是递归的.为了解决一个给定的问题,算法一次或多次递归调用其本身以解决紧密相关的若干子问题. 思想: 将原问题分解为几个规模较小但类似有原问题的子问题,递归地求解这些子问...

【从零学习经典算法系列】分治策略实例——快速排序(QuickSort)

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要O(nlogn)次比较。在最坏状况下则需要O(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlogn)算...

分治策略—归并排序

归并排序很好的体现了分治策略的思想,即将问题分解成同样但事实规模更小的子问题。比如说这里的归并排序,就是有序子列的并归。 如上图 将两个子序列合并到一个temp 数组(这里是暂存的作用),需要三个指针...

算法笔记六:使用分治策略执行快速排序

算法思想: //采用分治策略,将原数组,分解为三部分:左边的 + 已最终定位的节点位置 + 右边的 //分解:取任意一个位置的数,将数组划分为3部分:左边+该数的最终位置+右边,继续对左右...

【分治策略】归并排序算法总结

归并排序思想归并排序的思想很简单,拿到一个无序的序列,先从序列的中间位置将其切分成两个子序列,然后对两个子序列递归地进行归并排序,最后,将排好序的子序列合并成一个完整的有序序列。归并排序算法的伪代码如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)