快速排序与荷兰国旗及Partition问题
快速排序与荷兰国旗及Partition问题
需求:
1、Partition过程
给定一个数组arr,和一个整数num。请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。
要求额外空间复杂度O(1),时间复杂度O(N)
2、荷兰国旗问题
给定一个数组arr,和一个整数num。请把小于num的数放在数组的左边,等于num的数放在中间,大于num的数放在数组的右边。
要求额外空间复杂度O(1),时间复杂度O(N)
3、快速排序
思路:
1、Partition过程:
在原数组左边设置一个边界(left - 1),当index指向的数值比给定的值num小或等于时,
将这个数与边界右边的数交换,然后边界右移,
当index指向的数值比num大时,index右移动,边界
2、荷兰国旗问题(NetherLandsFlag):
在原数组左边设置一个左边界(left - 1),右边设置一个右边界(right+1),当index指向的数值比给定的值num小时,
将这个数与左边界右边的第一个数交换,然后左边界右移,index左移,当index指向的数值比num大时,将这个数与右边界左边的第一个数交换,然后i右边界左移,index不动,当index指向的数值与num相等时,边界均不动,index左移.
3、快速排序1.0:
用arr[R]对该范围做partition,小于等于 arr[R]的数在左部分并且保证arr[R]最后来到左部分的最后一个位置,记为M; 大于 arr[R]的数在右部分(arr[M+1..R])
2)对arr[L..M-1]进行快速排序(递归)
3)对arr[M+1..R]进行快速排序(递归)
因为每一次partition都会搞定一个数的位置且不会再变动,所以排序能完成.
4、快速排序2.0:
在arr[L..R]范围上,进行快速排序的过程:
1)用arr[R]对该范围做NetherLandsFlag,小于 arr[R]的数在左部分,等于arr[R]的数中间大于arr[R]的数在右部分。假设等于arr[R]的数所在范围是[a,b]
2)对arr[L..a-1]进行快速排序(递归)
3)对arr[b+1..R]进行快速排序(递归)
因为每一次partition都会搞定一批数的位置且不会再变动,所以排序能完成
5、快速排序3.0(随机快排+荷兰国旗技巧优化):
在arr[L..R]范围上,进行快速排序的过程:
1)在这个范围上,随机选一个数记为num,
1)用num对该范围做NetherLandsFlag,小于num的数在左部分,等于num的数中间,大于num的数在右部分。假设== num的数所在范围是[a,b]
2)对arr[L..a-1]进行快速排序(递归)
3)对arr[b+1..R]进行快速排序(递归)
因为每一次partition都会搞定一批数的位置且不会再变动,所以排序能完成
代码实现:
1、Partition过程:
//Partition
public static int quickSortPartition(int [] arr,int left,int right){
if (arr == null || arr.length < 2){
return -1;
}
if (left > right) {
return -1;
}
if (left == right) {
return right;
}
int lessEqual = left - 1;
int index = left;
while(index < right){
if (arr[index] <= arr[right]){
swap(arr,index,++lessEqual);
}
index++;
}
swap(arr,right,++lessEqual);
return lessEqual;
}
2、荷兰国旗问题(NetherLandsFlag):
public static int [] netherlandsFlag(int [] arr,int left,int right){
if (left > right){
return new int [] {-1,-1};
}
if (left == right){
return new int [] {left,right};
}
int Value = arr[right];
int lessEqual = left - 1;
int moreEqual = right + 1;
int index = left;
while(index < moreEqual){
if (arr[index] < Value){
swap(arr,index,++lessEqual);
}
if (arr[index] > Value){
swap(arr,index,--moreEqual);
index--;
}
index++;
}
return new int [] {lessEqual,moreEqual};
}
3、快速排序
//quickSort1.0
public static void quickSort01(int [] arr){
if (arr == null || arr.length < 2){
return;
}
process01(arr,0,arr.length-1);
}
public static void process01(int [] arr, int left ,int right){
if (left >= right){
return;
}
int mid = quickSortPartition(arr,left,right);
process01(arr,left,mid-1);
process01(arr,mid+1,right);
}
//quickSort2.0
// 主要是会有两个边界,没有浪费每次对比的信息
public static void quickSort02(int [] arr){
if (arr == null || arr.length < 2){
return;
}
process02(arr, 0 ,arr.length-1);
}
public static void process02(int [] arr, int left ,int right){
if(left >= right){
return;
}
int[] bound = netherlandsFlag(arr, left, right);
process02(arr,left,bound[0]);
process02(arr,bound[1],right);
}
//quickSort3.0
public static void quickSort3(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
process3(arr, 0, arr.length - 1);
}
public static void process3(int[] arr, int L, int R) {
if (L >= R) {
return;
}
swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
int[] equalArea = netherlandsFlag(arr, L, R);
process1(arr, L, equalArea[0] - 1);
process1(arr, equalArea[1] + 1, R);
}
快速排序与荷兰国旗及Partition问题的更多相关文章
- July收集荷兰国旗问题之三路partition
这道题目和分成两块的partition的扩展.比如有一堆0 1 2 数字组成的数组,要分成 00 00 11 1 1 222 2这样的顺序的. 利用lumoto版的partition能够非常好的解 ...
- 荷兰国旗 Flag of the Kingdom of the Netherlands
问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...
- 荷兰国旗问题、快排以及BFPRT算法
荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...
- java荷兰国旗问题
荷兰国旗包含三种颜色:红.白.蓝. 有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列.它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素.等 ...
- ACM 荷兰国旗问题
荷兰国旗问题 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列,要 ...
- 算法笔记_051:荷兰国旗问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为 ...
- Coursera Algorithms week2 基础排序 练习测验: Dutch national flag 荷兰国旗问题算法
第二周课程的Elementray Sorts部分练习测验Interview Questions的第3题荷兰国旗问题很有意思.题目的原文描述如下: Dutch national flag. Given ...
- NYOJ_268_荷兰国旗问题
荷兰国旗问题 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描写叙述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列.要 ...
- Java实现荷兰国旗问题
问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后 ...
随机推荐
- Python 设计模式——单例模式
单例模式即确保类有且只有一个特定类型的对象,并提供全局访问点.因此通常用于日志记录.数据库操作.打印机后台处理程序等.这些程序在运行过程中只生成一个实例,避免对同一资源产生相互冲突的请求. 特点: 确 ...
- [UWP] - Adaptive Trigger Featurede的使用方法及效果
XAML代码: <Page.Resources> <!-- DataTemplate to use in the portrait layout. --> <DataTe ...
- 服务器挂掉导致需要对k8s新增节点
[导读]今日是周六,本想午休起来之后写篇有关kubernetes service的文章,没想到两台虚拟机接连挂掉,所以又重新创建了两台虚拟机.新建时又一直黑屏,所以只能克隆. 由于虚拟机是新建的,所以 ...
- 7. JDK拍了拍你:字符串拼接一定记得用MessageFormat#format
目录 ✍前言 版本约定 ✍正文 DateFormat:日期时间格式化 SimpleDateFormat NumberFormat:数字格式化 DecimalFormat 一.0和#的使用(最常见使用场 ...
- CTF:从0到1 -> zero2one
本篇blog首发0xffff论坛(CTF:从0到1->zero2one - 0xFFFF),中间有各位大佬补充,搬到了个人博客CTF:从0到1 -> zero2one | c10udlnk ...
- 使用sqoop将mysql数据导入到hive中
首先准备工具环境:hadoop2.7+mysql5.7+sqoop1.4+hive3.1 准备一张数据库表: 接下来就可以操作了... 一.将MySQL数据导入到hdfs 首先我测试将zhaopin表 ...
- 30天自制操作系统-day3
30天自制操作系统-day3 前2天我们分别使用了直接使用二进制编辑器和简单的汇编指令生成了img文件,今天我们尝试一下使用稍微复杂一点的汇编指令 os.asm文件内容如下: ; hello-os ; ...
- java中byte,byte[]和int之间的转换
1>byte类型转换为,直接隐式转换,适用于要求保持数值不变,例如要求进行数值计算 如 byte b=0x01; int i=b; 2>另一种是要求保持最低字节中各个位不变,3个高字节全部 ...
- Navicat Premium 12连接MySQL数据库出现Authentication plugin 'caching_sha2_password' cannot be loaded的解决方案
1. 管理员权限运行命令提示符,登陆MySQL mysql -u root -p password 2. 修改账户密码加密规则并更新用户密码 ALTER USER 'root'@'localhost' ...
- IntelliJ IDEA实用插件
Free MyBatis plugin 插件效果 Save Actions 插件设置 勾选后Ctrl + S就会执行格式化操作,等价于格式化快捷键Alt + Ctrl + L
