快速排序(由荷兰国旗问题到快排)
文章目录
- 一、荷兰国旗问题
- 荷兰国旗解题思路
- 荷兰国旗代码
- 二、荷兰国旗到快排
- 时间复杂度分析
- 稳定性分析
一、荷兰国旗问题
在了解快排之前,我们首先了解荷兰国旗问题
给定一个数组arr,和一个整数num。请把小于num的数放在数组的左边,等于num的数放在中间,大于num的数放在数组的右边。
要求额外空间复杂度O(1),时间复杂度O(N)
荷兰国旗解题思路
首先我们先定义小于区less和大于区more
我们分出三种情况
1.当前数等于目标数,下标直接加1,不做交换
2. 当前数小于目标数,当前数与小于区的下一个元素交换,小于区扩大,下标加1
3. 当前数大于目标数,当前数与大于区上一个元素交换,大于区扩大,下标不变
荷兰国旗代码
//在快排中,我们假设最后一个数为目标数public static int[] netherlandsFlag(int[] arr, int L, int R) {if (L > R) {return new int[] { -1, -1 };}if (L == R) {return new int[] { L, R };}int less = L - 1;int more = R;int index = L;while (index < more) {if (arr[index] == arr[R]) {index++;} else if (arr[index] < arr[R]) {swap(arr, index++, ++less);} else {swap(arr, index, --more);}}swap(arr, more, R);return new int[] { less + 1, more };}
二、荷兰国旗到快排
我们已经了解了荷兰国旗问题,那么快排的过程就是
1)在这个范围上,随机选一个数记为num,
2)用num对该范围做partition(荷兰国旗问题),< num的数在左部分,== num的数中间,>num的数在右部分。假设== num的数所在范围是[a,b]
3)对arr[L…a-1]进行快速排序(递归)
4)对arr[b+1…R]进行快速排序(递归)
public static void quickSort1(int[] arr) {if (arr == null || arr.length < 2) {return;}process(arr, 0, arr.length - 1);}public static void process(int[] arr, int L, int R) {if (L >= R) {return;}//在L和R中随机把一个数交换到r位置swap(arr, L + (int) (Math.random() * (R - L + 1)), R);int[] equalArea = netherlandsFlag(arr, L, R);process(arr, L, equalArea[0] - 1);process(arr, equalArea[1] + 1, R);}public static int[] netherlandsFlag(int[] arr, int L, int R) {if (L > R) {return new int[] { -1, -1 };}if (L == R) {return new int[] { L, R };}int less = L - 1;int more = R;int index = L;while (index < more) {if (arr[index] == arr[R]) {index++;} else if (arr[index] < arr[R]) {swap(arr, index++, ++less);} else {swap(arr, index, --more);}}swap(arr, more, R);return new int[] { less + 1, more };}
时间复杂度分析
1)通过分析知道,划分值越靠近中间,性能越好;越靠近两边,性能越差
2)随机选一个数进行划分的目的就是让好情况和差情况都变成概率事件
3)把每一种情况都列出来,会有每种情况下的时间复杂度,但概率都是1/N
4)那么所有情况都考虑,时间复杂度就是这种概率模型下的长期期望!
稳定性分析
稳定性是指同样大小的样本再排序之后不会改变相对次序
因为快排在做partition过程中,破坏了数组元素的相对次序,因此快排无法做到稳定
快速排序稳定性可以进行改进,“01 stable sort”,但是会对样本数据要求更多
快速排序(由荷兰国旗问题到快排)相关推荐
- 快速排序以及荷兰国旗问题
荷兰国旗 要点:指针在移动时, 1.如果指针对应的值小于给定值,左标记和指针均向右移 2-如果指针对应的值等于给定值,指针右移 3-如果指针对应的值大于给定值,右标志位左移 package Test; ...
- 快速排序的三种方式以及快排的优化
一.快速排序的基本思想 关于快速排序,它的基本思想就是选取一个基准,一趟排序确定两个区间,一个区间全部比基准值小,另一个区间全部比基准值大,接着再选取一个基准值来进行排序,以此类推,最后得到一个有序的 ...
- 10.经典快排和快排加速
随机快速排序的细节和复杂度分析 可以用荷兰国旗问题来改进快速排序,时间复杂度0(N*logN),额外空间复杂度O(logN) 经典快排 从数列中随机挑出一个元素作为基准,比如将一个数组的最后一个元素x ...
- 快排 (quick sort)
使用快速排序之前,先了解一下荷兰国旗问题,快排的思想前提就是荷兰国旗问题. 快排小结: 快排将给定序列的最后一个值作为flag,也可理解为"轴"(等同于荷兰国旗问题中给定的一个nu ...
- 三路快排算法加强版(三路快排的再次改进)
:不要忘记初心哈 :) 理论依据 快排算法的缺陷及其逐一改进 三路快排尽可能三等份划分区间 通过待排元素的区间长度划分? 通过待排元素的最值之差划分? 直接使用待排元素的最大值划分? 实验数据 大范围 ...
- 快排Java代码实现(Quick Sort)
1. 快排算法思路 基本思想:通过一趟快速排序将待排数组分割成独立的两份部分; 其中一部分数组的值均比另一部分数组的值小,则可分别对着两部分数组继续进行排序,以达到整个序列有序. 快排的平均时间复杂 ...
- c语言程序快排,C语言快排
C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为自由) qsort 的函数原型是: void qsort(void*base ...
- 多图养眼!Partition,荷兰国旗问题与随机快排
快速排序的思想是通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归方式实现,以此达到整 ...
- 推土机(快排)荷兰国旗思路
前言 仅记录学习笔记,如有错误欢迎指正. 题目 给一个数据 小于数据中的某个数都在左边 大于这个数的 在右边 要求 时间复杂度O(N) 空间复杂度O(1) 解法: //给一个数据 小于数据中的某个数都 ...
最新文章
- Java基础day9
- 1个多月就能看到效果的减肥大法 - 健康程序员,至尚生活!
- tomcat增加处理线程数量
- opencv SURF角检测
- 大型网站的特点及优化方向是什么
- View的setLayerType() , setDrawingCacheEnabled() 方法用法
- Spring对 JDBC 的支持,JdbcTemplate类的使用
- CodeForces - 1384
- 系统同步网络时间服务器不可用,电脑时间同步出错 RPC服务器不可用解决方案...
- NFT吸血DeFi,冰火两重天
- 银行mysql面试题_mysql的常见面试题
- 瀑布模型、快速原型模型、螺旋模型优缺点
- creo5.0安装教程
- html调用rpst 源码_在web页面中播放rtsp直播数据流方法
- python win32处理Excel(方法篇)
- 项目质量管理中的新老7工具
- 微信小程序配合物联网进行控制esp8266
- 【Rust日报】 2019-04-16 : nude-rs - 高性能黄图检测
- python 源码编译 without_vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译(示例代码)...
- 第二章-Coin Dash
热门文章
- android 7.0 iso下载地址,iOS 7.0固件 全系列官方正式版下载地址
- docx行间距怎么设置_word行间距怎么调?word行距调小调大固定值怎么调?
- 3g html5手机网站,手机网站新模式 3G门户HTML5概念版问世
- 网络设置巨形帧_NAS的巨型帧(Jumbo_Frame)设置对其传输速度的影响的评测与分析...
- 软件测试丨Git分支管理实操,搞定在线合并和本地合并
- 360网站卫士SQL注入绕过案例一个
- Hbuildx的快捷键集合
- hbuildx编辑器在文件编译上的bug
- 关于LINUX系统netterm终端登陆乱码问题。
- ‘数据库基础、MariaDB服务部署、库表基本管理、数据类型’经典案例