排序------------------分治策略与组合法
来源:互联网 发布:怎样在淘宝上卖二手货 编辑:程序博客网 时间: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)。
- 排序------------------分治策略与组合法
- 递归与分治策略-----合并排序
- 递归与分治策略之快速排序
- 递归与分治策略之快速排序
- 递归与分治策略-2.8快速排序
- 分治策略实现快速排序法
- 分治策略----快速排序
- 递归与分治策略-2.7合并排序(归并排序)
- 递归与分治策略
- 递归与分治策略
- 递归与分治策略
- 递归与分治策略
- 递归与分治策略
- 分治策略与递归
- 递归与分治策略
- 递归与分治策略
- 递归与分治策略
- 递归与分治策略
- Oracle shutdown immediate hang住 现象分析(转至dave的blog)
- 自动生成用户名或密码
- Oracle中日期Date类型格式的转化
- 循环获取Map集合数据
- 2009操作系统
- 排序------------------分治策略与组合法
- <项目日志 1004> 轻量便携流媒体播放器框架设计-2
- 在 Linux 下用户空间与内核空间数据交换的方式之二
- java 之 线程池学习
- 如何调试跟踪Android源代码
- Java ClassLoader
- struts的ActionRedirect类
- linux c inline
- 深入探讨用位掩码代替分支(2):汇编代码分析