【算法】--分治法

一、分治法简介


分治策略 (divide-and-conquer):将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

分治模式在每层都有三个步骤:

  1. 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。
  2. 解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。
  3. 合并这些子问题的解成原问题的解。

二、分治法应用——归并排序


归并排序完全依照了分治法的思想:
分解:将个预排列的数分成两个各含n/2个数的子列;
解决:用归并排序法对两个子序列递归地排序;
合并:合并两个已排序的子序列以得到排序结果。
对子序列排序时,其长度为1时递归结束。单个元素被视为是已排好序的。

归并排序的重要步骤就是归并,即将已经排序好的两个子序列合并;
下面引入MERGE过程完成合并:
子数组A1[p…q],A2[q+1…r]合并为A[p…r];

//伪代码
MERGE(A, p, q, r)
  n1 = q - p + 1
  n2 = r - q
  let L[1 .. n1 + 1] and R[1 .. n2 + 1] be new arrays
  for i = 1 to n1
      L[i] = A[p + i - 1]
  for j = 1 to n2
      R[j] = A[q + j]
  L[n1 + 1] = MAX
  R[n2 + 1] = MAX
  i = 1
  j = 1
  for k = p to r
     if L[i] <= R[j]
         A[k] = L[i]
         i = i + 1
     else 
         A[k] = R[j]
         j = j + 1

再就是分解子问题的过程,对于数组A[p…r],只有当p>=r(即只有一个元素)时才视为一个已排序的序列;否则就将该数组分解为子数组A1[p…q],A2[q+1…r];

MERGE-SORT(A, p, r)
 if p < r
     q = (p + r) / 2
     MERGE-SORT(A, p, q)
     MERGE-SORT(A, q + 1, r)
     MERGE(A, p, q, r)

归并排序Java实现:

/*归并排序
*@author WaverlyW
*/
class MergeSort{
   
    private int p,r;
    private int[] arry;
    MergeSort(int[] arry){
   
        this
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值