• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

竹千代

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

分治法

核心数学式:f(n) = F + f([0,n/2]) + f([n/2,n])

思路:

  1. 进行相应处理(打印结点、选好哨兵),将整个集合一分为二(一般是分为两部分)
  2. 分别迭代处理两个半集合    

适用情景:

  对一个很大集合,进行内部元素两两处理(比较大小,或者判断方位)

步骤:

  1. 分    把问题集合分为独立的几个小集合

  2. 治    各自解决

  3. 合    把小集合的解合并成最终解

例子:快排、二叉树遍历、最近点对、大整数乘法

/*
 * 快排
 *
 */

#include <iostream>

template <class T>
void qQsort(const T[] array, int start, int end) {
    if (end - start > 5) {
        int median = (start + end) / 2;
        swap(array, start, median);

        int i = start, j = end;
        T pivot = array[start];
        while(j > i && array[j] > pivot)    j--;
        while(i < j && array[i] < pivot)    i++;
        if(i < j)       swap(array, i, j);

        qQsort(array, start, median-1);
        qQsort(array, median+1, end);
    } else {
        /* 数量少时用插入排序效果更好 */
    }
}

 

posted on 2015-07-28 09:47  竹千代  阅读(266)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3