分治法:快排划分法(单向扫描法)
一、分治法
将一个规模较大的问题转化为多个相同形式小规模的子问题,子问题规模较小时,可自然求解。
子问题的解可通过合并得到原问题的解。
举例:小明让小张和小李去借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;}
分治法:快排划分法(单向扫描法)相关推荐
- 程序员面试金典 - 面试题 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 ...
- 飞镖 501 分最快完成比赛法(完美比赛方案)(9镖)
[b]Nine-dart finish[/b] [url]http://en.wikipedia.org/wiki/Nine-dart_finish[/url] 最常见的模式: 3T20 + 3T20 ...
- 蛮力法与分治法解决最近点对问题-详细分析与C++代码实现
最近点对问题 最近点对问题の目录 最近点对问题 什么是最近点对问题 代码基本框架 蛮力法及其代码 分治法及其代码 一般分治法遇到的特殊情况 如何优化分治法(6点确定与4点确定解法) 优化后分治法(4点 ...
- 算法基础:快排优化:为什么快排都会TLE
在算法训练中,快排应该是基础中的基础了,直接使用前面介绍的快排,无论是单向循环还是双向循环方式,在特定的数据序列下,都有可能出现TLE(Time Limit Exceeded)超时,这篇文章对原因和基 ...
- 分治法的概念以及应用
分治法:"分久必合,合久必分" 哈哈,其实分治法应该理解为分而治之的方法,它的基本思想是把一个大的问题比较复杂的问题,拆分成多个规模较小的子问题,然后解决这些子问题的难度就比原来大 ...
- 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)
分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...
- 分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?
快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程 我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡 快排第一种划分子问 ...
- 分治法与蛮力法求最近点对问题(分治法时间复杂度O(nlogn))
讲解分治法求最近点对问题的思想与算法实现. 利用分治法求最近点对与归并排序的结构上的相同,将时间复杂度降到真正意义上的O(nlogn)而不是O(nlognlogn). 1. 预处理:创建结构体Node ...
- 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
(1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...
最新文章
- PacificA 一致性协议解读
- 优质网站策划从四个方面进行判断
- 如何更好的与人沟通?[图]
- 百度网盘文件分享演示,如何查看已经分享的文件
- repeater 时间格式化
- fc-ae-1553_什么是AE-L,AF-L和*按钮,它们的作用是什么?
- Enter passphrase for key '/home/mha/.ssh/id_rsa解决方法
- eclipse中mybatis generator插件的安装与使用,实现自动生成代码
- 模糊规则优化matlab,遗传算法优化模糊pid控制规则
- 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
- 实在智能签约上海联通,共创美好智慧生活
- erlang使用c语言开发的吗,Erlang语言作者告诉你什么才是编程最好的方法
- 搜狗AI事业部张博:不只翻译机,半年内将推数款智能硬件产品
- 华南理工大学电气考研经验贴
- CCF CSP 行车路线 java 201712_4
- APP同过ESP8266与51单片机通信
- 第一章 关于交易的思考 | 期权, 皇冠上的明珠?
- socks 编程中的 strncpy_s 坑
- 【H3C模拟器】基于端口VLAN的交换机配置实验(不同vlan互通)
- [附源码]Python计算机毕业设计SSM基于Web课堂签到管理系统(程序+LW)
热门文章
- 学python能赚钱吗-做直播能有多赚钱,Python告诉你
- python爬虫-8个最高效的Python爬虫框架,你用过几个?
- 1000行代码入门python-Python基础知识和工作环境
- python中文视频教程-鱼C零基础入门 Python中文视频教程
- Kaldi语音识别快速入门
- python分数类_利用标准库fractions模块让Python支持分数类型的方法详解
- Error: ER_ACCESS_DENIED_ERROR: Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法
- 我与CSDN的2020年
- 【java笔记】异常处理
- 一个做得很好的电子产品测评类网站:Zealer