分治法以及快速排序

分治法

  分治法(divide and conquer,D&C):将原问题划分成若干个规模较小而结构与原问题一致的子问题 ;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
  容易确定运行时间,是分治算法的优点之一。
  分支模式在每一层递归上都有三个步骤:
    --分解(Divide):将原问题分解为一系列子问题;
    --解决(Conquer):递归地解各子问题。若子问题足够小,则直接有解;
    --合并(Combine):将子问题的结果合并成原问题的解。
  分治法的关键点:
    原问题可以一直分解为形式相同子问题,当子问题规模较小时,可自然求解,如一个元素本身有序
    子问题的解通过合并可以得到原问题的解
    子问题的分解以及解的合并一定是比较简单的,否则分解和合并所花的时间可能超出暴力解法,得不偿失

快速排序算法

  1、分解:数组A[p..r]]被划分成两个子数组A[p..q-1]和A[q+1,r],使得A[q]为大小居中的一个数,左侧A[p..q-1]中的每一个元素都小于等于它,而右侧A[q+1,r]中的每个元素都大于等于它。其中计算下标q也是划分过程的一部分。
  2、解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1,r]进行排序
  3、合并:因为子数组都是原址排序的,所以不需要合并,数组A[p..r]已经有序
  所以划分非常重要,具体一些划分方法以及优化在下一篇博客介绍。

原文地址:https://www.cnblogs.com/xiaoyh/p/10263355.html

时间: 2024-10-11 16:41:47

分治法以及快速排序的相关文章

蓝桥杯——基础练习之分治法_快速排序

分治法,分而治之,基本思路:分,解,和. 初探分治之快速排序. public class _DividedConquer { static int[] iarr; public static void main(String[] args) { // TODO Auto-generated method stub iarr=new int[]{6,4,5,3,1,2}; quick(0, iarr.length-1); for(int i:iarr) { System.out.print(i+"

Quick-Select 1亿个数快速求第K小的数 分治法

Quick-Select  1亿个数快速求第K小的数  分治法 利用快速排序的思想,一开始选取中枢元,然后左右调整,接着比对中枢元p和K的大小,如果 p+1 = k (数组从0开始), 那么a[p] 就是答案,因为在p之前的,肯定都是小于a[p]的, 在p之后的,肯定大于p, 所以 a[p] 就是第 p+1 小.假如 p+1 不等于K, 那么根据大小,进行左右调整.调整过程中,理想状态下,每次都砍掉一半,数组的起始坐标要进行调整. 代码: // 快速排序法的修改 #include <iostre

分治法-合并排序和快速排序

分治法是按照以下方案工作的: 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模 对这些较小的实例求解(一般使用递归方法,但在问题规模足够小的时候,有时会利用另一种算法以提高效率) 如果必要的话,合并较小问题的解,以得到原始问题的解 分治法的流程: 4.1 合并排序 合并排序是成功应用分治技术的一个完美例子(书上说的). 对于一个需要排序的数组,合并排序把它一分为二,并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组. 代码实现: /** * 合并排序 * @au

C语言实现快速排序法(分治法)

title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思想:将原问题分解为若干个更小的与原问题相似的问题,然后递归解决各个子问题,最后再将各个子问题的解组合成原问题的解. 利用分治法可以将解决办法分为 "三步走" 战略: (1) 在数据集中选定一个元素作为"基准"(pivot) (2) 将所有数据集小于基准的元素放在基准左边

专题:分治法

分治法(Divide and Conquer) 作为五大算法之一的分治法,可算是最早接触的一种算法.分治法,与其说是一种算法,不如将其称为策略来的更贴切一些.算法的思想就是将大问题分成小问题,并解决小问题之后合并起来生成大问题的解. 分治法的精髓: 分--将问题分解为规模更小的子问题: 治--将这些规模更小的子问题逐个击破: 合--将已解决的子问题合并,最终得出“母”问题的解: 分治法的作用,自然是让程序更加快速地处理问题.比如一个n的问题分解成两个n/2的问题,并由两个人来完成,效率就会快一些

分治法(一)

这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它们放在一起来比较,看看分治是如何实现滴.由于内容太多,我将再花一篇文章来写4个之前没有写过的分治算法:1,大整数乘法   2,矩阵乘法的分治策略   3,最近点对  4,凸包问题,请见下一篇. 好了,切入正题. --------------------------------------------

分治法

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子问题的解可以合并为该问题的解: 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题. 分治法的基本步骤:分治法在

分治法-最近距离问题Java实现

分治算法,有很多典型的问题,如最近点问题.线性选择问题.整数划分问题.大整数成绩问题.棋盘覆盖问题.循环赛日程表.二分搜索.Strassen矩阵乘法.汉诺塔等.准备花些时间逐个解决这些问题,并用Java实现,从最近点问题开始.网上找到一些代码,标题如"java 用蛮力法和分治法求解最近对有关问题",虽然体现了分治,但划分不够彻底,因此我重新对其进行了实现. 一.基本思想及策略: 首先,说说分治的思想.分治, "分而治之",就是把一个复杂的问题分成两个或更多的相同或相

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时