快速排序——三种划分方式
思路:
1.分治思想:先划分成两个问题,然后对两个子问题递归排序,最后再合并。
2.核心算法:快排的核心在于划分问题(找到分界点)。
代码:
//快速排序
public static void quickSort(int[] arr, int left, int right) {if(left < right) {//此处用单指针扫描来划分(可以替换划分方法)int fenjiedian = singleScan_partition(arr,left,right);//从分界点开始分成两段子问题quickSort(arr,left,fenjiedian-1);//递归解决子问题1quickSort(arr,fenjiedian+1,right);//递归解决子问题2}
}
快排的三种划分方法:
1.单指针扫描划分:
思路:p1作为扫描指针,找到比pivot大的元素则停下与p2元素交换,p2后移。
代码:
//单指针扫描
public static int singleScan_partition(int[] arr, int left, int right) {//确定参考值int pivot = arr[left];//建立p1指针int p1 = left+1;//建立p2指针int p2 = right;while(p1 <= p2) {//p1指的元素小则前移,否则就与p2交换,p2后移if(arr[p1] <= pivot){p1++;} else {Util.swap(arr,p1,p2);p2--;}}//当p1指针和p2指针交叉的时候退出循环//画草图举例分析可以知道最终p2所在位置就是两个子问题的分界点Util.swap(arr,p2,left);return p2;
}
2.双指针扫描划分:
思路:p1找到比pivot大的元素停下,p2找到比pivot小的元素停下,然后交换p1,p2元素
代码:
//双指针扫描
public static int doubleScan_partition2(int[] arr, int left, int right) {//指定参考值int pivot = arr[left];//创建p1指针int p1 = left+1;//创建p2指针int p2 = right;//p1与p2交叉时退出循环while (p1 <= p2) {//注意:!!!!!!!!条件要并上 p1 <= p2while(p1 <= p2 && arr[p1] <= pivot) p1++;while(p1 <= p2 && arr[p2] > pivot) p2--;if(p1 <= p2) Util.swap(arr,p1,p2);}//p2所在下标即为分界点Util.swap(arr,p2,left);return p2;
}
3.三指扫描划分
思路:p1指针遇到大于pivot的元素停下,p2遇到小于pivot元素停下,此时交换p1,p2,p1遇到等于pivot的元素则equal跑过来,p1继续前移,遇到小于pivot的数则与equal交换。
代码:
//三指针扫描(待定复盘)
public static int threeScan_partition(int[] arr, int left, int right) {int pivot = arr[left];int p1 = left+1;int equal = p1;int p2 = right;while(p1 <= p2) {//遇到大的元素和等于的元素p1都可能停下while(p1 <= p2 && arr[p1] < pivot) p1++;//遇到小的元素p2停下while(p1 <= p2 && arr[p2] >= pivot) p2--;//遇到相等的元素,equal移动到p1位置,p1前移while(p1 <= p2 && arr[p1] == pivot) {equal = p1;p1++;}//如果p1因为遇到比equal更小的元素而停下if(p1 <= p2 && arr[p1] < arr[equal]) Util.swap(arr,p1,equal);//否则p1和p2同时停下else if(p1 <= p2) {Util.swap(arr,p1,p2);}}//循环结束后,p1与p2交叉Util.swap(arr,left,p2);return p2;
}
收获:
1.快排和核心算法在于分区,在同一个数组上通过指针位移比较,进行元素的交换。
2.与归并排序不同的是,归并排序重在合并,其中要建立辅助空间拷贝原数组,再进行指针位移比较,然后把元素覆盖到原数组的位置。
3.复盘的时候一边写注释梳理思路一边写代码。
快速排序——三种划分方式相关推荐
- 快速排序三种实现方式及其优化
快速排序三种实现方式及其优化 1.关于快速排序 快速排序是分治法的一个应用. 根据分治法的思想,快速排序算法可描述为: 分解∶数组A[p-r]被划分为两个子数组A[p-q-1]和A[q+1,r],使得 ...
- vlan的三种划分方式、pvlan和网段(子网)的关系
在任何一本讲vlan的网络书上都会提到vlan的三种划分方式: 1.按物理地址划分 2.按交换机端口划分 3.按ip地址划分 本文的结论为:pvlan就是 按交换机端口划分 的一种实现 子网 ...
- C语言快速排序算法及三种优化方式
C语言快速排序算法及三种优化方式 C语言快速排序算法及三种优化方式 原理 快速排序复杂度分析 1 时间复杂度 2 空间复杂度 快速排序代码实现 1 普通快速排序 2 快速排序优化1-三数取中优化不必要 ...
- FPGA之道(41)HDL的三种描述方式
文章目录 前言 三种描述方式 结构化描述方式 数据流描述方式 行为级描述方式 前言 常编写Verilog代码的就会知道,我们对于某一功能的描述,可以通过门电路来描述,也可以直接描述其功能等,这就牵扯到 ...
- 【 Verilog HDL 】HDL的三种描述方式
当我们使用HDL代码描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式.数据流描述方式和行为级描述方式.通过本次总结,我们将明白到底我们描述的电路是什么方式描述的. 结构化描述方式 结构化描 ...
- oracle Hash Join及三种连接方式
在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...
- linux内核 struct page结构的三种存放方式
目录 page struct的三种存放方式 1) FLATMEM 2) SPARSEMEM 3) SPARSEMEM_VMEMMAP 随着硬件能力的提升,系统内存容量变得越来越大.尤其是在服务器上,过 ...
- 计算机网络笔记---互联网的组成及三种交换方式
互联网的组成 互联网从工作方式上可以划分为两大块: (1)边缘部分:由连接在互联网上的大量主机组成,由用户直接使用的部分. 这些主机包括了一切可以联网的设备,包括电脑,手机,联网的摄像头,更大的有互联 ...
- (考研湖科大教书匠计算机网络)第一章概述-第二节:三种交换方式(电路交换、报文交换和分组交换)
获取pdf:密码7281 专栏目录首页:[专栏必读]王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记.题目题型总结.注意事项.目录导航和思维导图 王道考研408计算机组成原理万字笔记 ...
最新文章
- 汇编第二章节检测2-1
- FCN全连接卷积网络(5)--Fully Convolutional Networks for Semantic Segmentation阅读(相关工作部分)
- linux学习一天一个命令(4)[mkdir命令]
- tomcat配置url跳转_Tomcat安装、配置、优化及负载均衡详解
- android imageview 图片模糊,imageview实现高斯模糊
- mysql嵌套查询语句
- SpringBoot实现短信验证码校验
- 快速切换清华源、百度源的方法
- list里每个元素字符串转为int;‘list‘ object is not callable;list中字符串改为int;字符串转为list;list每个int转为str;list转为字符串;
- 这几个免费PPT模板、素材库,你绝对不能错过
- 使用Python+Pandas+Statsmodels建立线性回归模型预测房价
- EtherCAT原理概述
- mysql replication /mysql 主从复制原理
- rk3288 定时器使用
- Premiere 移动式 马赛克
- 阿里云项目经理:Redis 开发规范
- (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...'for column 'VARIABLE_VALUE' at489
- linux分区500g分区方案,linux 硬盘分区 分区方案!!!
- java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式
- 米思齐的数码管图形化编程