思路:

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. 快速排序三种实现方式及其优化

    快速排序三种实现方式及其优化 1.关于快速排序 快速排序是分治法的一个应用. 根据分治法的思想,快速排序算法可描述为: 分解∶数组A[p-r]被划分为两个子数组A[p-q-1]和A[q+1,r],使得 ...

  2. vlan的三种划分方式、pvlan和网段(子网)的关系

    在任何一本讲vlan的网络书上都会提到vlan的三种划分方式: 1.按物理地址划分 2.按交换机端口划分 3.按ip地址划分 本文的结论为:pvlan就是    按交换机端口划分   的一种实现 子网 ...

  3. C语言快速排序算法及三种优化方式

    C语言快速排序算法及三种优化方式 C语言快速排序算法及三种优化方式 原理 快速排序复杂度分析 1 时间复杂度 2 空间复杂度 快速排序代码实现 1 普通快速排序 2 快速排序优化1-三数取中优化不必要 ...

  4. FPGA之道(41)HDL的三种描述方式

    文章目录 前言 三种描述方式 结构化描述方式 数据流描述方式 行为级描述方式 前言 常编写Verilog代码的就会知道,我们对于某一功能的描述,可以通过门电路来描述,也可以直接描述其功能等,这就牵扯到 ...

  5. 【 Verilog HDL 】HDL的三种描述方式

    当我们使用HDL代码描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式.数据流描述方式和行为级描述方式.通过本次总结,我们将明白到底我们描述的电路是什么方式描述的. 结构化描述方式 结构化描 ...

  6. oracle Hash Join及三种连接方式

    在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...

  7. linux内核 struct page结构的三种存放方式

    目录 page struct的三种存放方式 1) FLATMEM 2) SPARSEMEM 3) SPARSEMEM_VMEMMAP 随着硬件能力的提升,系统内存容量变得越来越大.尤其是在服务器上,过 ...

  8. 计算机网络笔记---互联网的组成及三种交换方式

    互联网的组成 互联网从工作方式上可以划分为两大块: (1)边缘部分:由连接在互联网上的大量主机组成,由用户直接使用的部分. 这些主机包括了一切可以联网的设备,包括电脑,手机,联网的摄像头,更大的有互联 ...

  9. (考研湖科大教书匠计算机网络)第一章概述-第二节:三种交换方式(电路交换、报文交换和分组交换)

    获取pdf:密码7281 专栏目录首页:[专栏必读]王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记.题目题型总结.注意事项.目录导航和思维导图 王道考研408计算机组成原理万字笔记 ...

最新文章

  1. 汇编第二章节检测2-1
  2. FCN全连接卷积网络(5)--Fully Convolutional Networks for Semantic Segmentation阅读(相关工作部分)
  3. linux学习一天一个命令(4)[mkdir命令]
  4. tomcat配置url跳转_Tomcat安装、配置、优化及负载均衡详解
  5. android imageview 图片模糊,imageview实现高斯模糊
  6. mysql嵌套查询语句
  7. SpringBoot实现短信验证码校验
  8. 快速切换清华源、百度源的方法
  9. list里每个元素字符串转为int;‘list‘ object is not callable;list中字符串改为int;字符串转为list;list每个int转为str;list转为字符串;
  10. 这几个免费PPT模板、素材库,你绝对不能错过
  11. 使用Python+Pandas+Statsmodels建立线性回归模型预测房价
  12. EtherCAT原理概述
  13. mysql replication /mysql 主从复制原理
  14. rk3288 定时器使用
  15. Premiere 移动式 马赛克
  16. 阿里云项目经理:Redis 开发规范
  17. (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...'for column 'VARIABLE_VALUE' at489
  18. linux分区500g分区方案,linux 硬盘分区 分区方案!!!
  19. java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式
  20. 米思齐的数码管图形化编程

热门文章

  1. 最大连续区间和的算法总结(转)
  2. 《大道至简》第二章读后感
  3. sql脚本比较大,sqlserver 无法导入,就用cmd命令执行
  4. 换SSD硬盘,重装系统,一阵子忙乱
  5. 提供《疯狂的程序员》下载地址
  6. 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法
  7. ZooKeeper官方文档学习笔记02-ZooKeeper入门指南
  8. 白帽SQL注入实战过程记录(2)——根据information_schema组装SQL注入语句
  9. linux网络系统调用,Linux网络系统调用接口--待续
  10. AD19无法生成PCB_PCB制造拥抱AI