一、分治法
将一个规模较大的问题转化为多个相同形式小规模的子问题,子问题规模较小时,可自然求解。
子问题的解可通过合并得到原问题的解。
举例:小明让小张和小李去借2000元,小张借1000,小李借1000,他们各自向朋友去借,这就是一个分治问题
二、一遍单向扫描法:
思路:用两个指针将数组划分为三个区间。
扫描指针左边是确认小于等于主元的。
扫描指针右边是确认大于主元的

一遍单向扫描法:选定第一个数组元素为主元,以它为基准,左指针开始从左边挨个扫描,若扫描到的元素比主元小或相等,则保持位置不变,若扫描到的元素比主元大,此时这个元素与右指针所指元素交换


交换之后右指针向左移动

右指针若遇到比主元大的元素,该元素保持原位置不动,右指针继续左移,若扫描到的元素比主元小,则和左指针所指位置元素交换。
重复以上步骤,直到左右指针相遇。
伪代码

伪代码
QuickSortquickSort(A,p,r) if(p<r)q=partition(A,p,r)quickSort(A,p,q-1)quickSort(A,q+1,r) partition(A,p,r)pivot=A[p];sp=p+1;  //sp为扫描指针;左指针p向右移动 bigger=r  //最右边元素 while(sp<=bigger);if(A[sp]<=pivot)  //扫描指针小于主元 sp++   //指针右移 elseswap(A,sp,bigger)  //否则交换指针所指元素 bigger--swap(A,p,bigger)return bigger

代码

public class Util {public static void main(String[] args) {int [] arr=Util.getRandomArr(10,1,20);  //数组长度为10,1-20之间随机选取10个数 Util.print(arr);int length;quickSort(arr,0,length-1);Util.print(arr);
}private static void print(int[] arr) {// TODO Auto-generated method stub}private static int[] getRandomArr(int i, int j, int k) {// TODO Auto-generated method stubreturn null;}public static  int quickSort(int A[],int p,int r){//定义数组A,p为初始左指针,r为初始右指针 if(p<r){  // int q=partition(A,p,r);  //分隔数组的左指针与右指针 ,左边元素大于右边元素 quickSort(A,p,q-1);   //左边元素大于右边元素 quickSort(A,q+1,r);}}public static int partition(int A[],int p,int r){int pivot=A[p];   //确定主元为第一个p所指的元素 int sp=p+1;  //sp为扫描指针;左指针p向右移动 int bigger=r;  //右指针;r为数组最右端的指针 while(sp<=bigger) //左指针扫描的元素大于有指针元素,一直继续扫描 if(A[sp]<=pivot)   //如果左指针所指元素小于主元 sp++;  //继续扫描    else   //否则 Util.swap(A,sp,bigger);   //将左指针所指元素与右指针所指元素交换 bigger--;    //右指针左移 swap(A,p,bigger);  //如果交换之后左指针所指元素还是大于主元 return bigger;}

分治法:快排划分法(单向扫描法)相关推荐

  1. 程序员面试金典 - 面试题 17.14. 最小K个数(快排划分O(n))

    1. 题目 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4]提示: 0 &l ...

  2. 飞镖 501 分最快完成比赛法(完美比赛方案)(9镖)

    [b]Nine-dart finish[/b] [url]http://en.wikipedia.org/wiki/Nine-dart_finish[/url] 最常见的模式: 3T20 + 3T20 ...

  3. 蛮力法与分治法解决最近点对问题-详细分析与C++代码实现

    最近点对问题 最近点对问题の目录 最近点对问题 什么是最近点对问题 代码基本框架 蛮力法及其代码 分治法及其代码 一般分治法遇到的特殊情况 如何优化分治法(6点确定与4点确定解法) 优化后分治法(4点 ...

  4. 算法基础:快排优化:为什么快排都会TLE

    在算法训练中,快排应该是基础中的基础了,直接使用前面介绍的快排,无论是单向循环还是双向循环方式,在特定的数据序列下,都有可能出现TLE(Time Limit Exceeded)超时,这篇文章对原因和基 ...

  5. 分治法的概念以及应用

    分治法:"分久必合,合久必分" 哈哈,其实分治法应该理解为分而治之的方法,它的基本思想是把一个大的问题比较复杂的问题,拆分成多个规模较小的子问题,然后解决这些子问题的难度就比原来大 ...

  6. 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

    分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...

  7. 分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?

    快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程 我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡 快排第一种划分子问 ...

  8. 分治法与蛮力法求最近点对问题(分治法时间复杂度O(nlogn))

    讲解分治法求最近点对问题的思想与算法实现. 利用分治法求最近点对与归并排序的结构上的相同,将时间复杂度降到真正意义上的O(nlogn)而不是O(nlognlogn). 1. 预处理:创建结构体Node ...

  9. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

最新文章

  1. PacificA 一致性协议解读
  2. 优质网站策划从四个方面进行判断
  3. 如何更好的与人沟通?[图]
  4. 百度网盘文件分享演示,如何查看已经分享的文件
  5. repeater 时间格式化
  6. fc-ae-1553_什么是AE-L,AF-L和*按钮,它们的作用是什么?
  7. Enter passphrase for key '/home/mha/.ssh/id_rsa解决方法
  8. eclipse中mybatis generator插件的安装与使用,实现自动生成代码
  9. 模糊规则优化matlab,遗传算法优化模糊pid控制规则
  10. 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
  11. 实在智能签约上海联通,共创美好智慧生活
  12. erlang使用c语言开发的吗,Erlang语言作者告诉你什么才是编程最好的方法
  13. 搜狗AI事业部张博:不只翻译机,半年内将推数款智能硬件产品
  14. 华南理工大学电气考研经验贴
  15. CCF CSP 行车路线 java 201712_4
  16. APP同过ESP8266与51单片机通信
  17. 第一章 关于交易的思考 | 期权, 皇冠上的明珠?
  18. socks 编程中的 strncpy_s 坑
  19. 【H3C模拟器】基于端口VLAN的交换机配置实验(不同vlan互通)
  20. [附源码]Python计算机毕业设计SSM基于Web课堂签到管理系统(程序+LW)

热门文章

  1. 学python能赚钱吗-做直播能有多赚钱,Python告诉你
  2. python爬虫-8个最高效的Python爬虫框架,你用过几个?
  3. 1000行代码入门python-Python基础知识和工作环境
  4. python中文视频教程-鱼C零基础入门 Python中文视频教程
  5. Kaldi语音识别快速入门
  6. python分数类_利用标准库fractions模块让Python支持分数类型的方法详解
  7. Error: ER_ACCESS_DENIED_ERROR: Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法
  8. 我与CSDN的2020年
  9. 【java笔记】异常处理
  10. 一个做得很好的电子产品测评类网站:Zealer