快速排序与荷兰国旗及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个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后 ...
随机推荐
- YOLO实践初探
学习了Andrew Ng 深度学习第三周卷积神经网络课程后,接着看了看YOLO论文,论文看得懵懵懂懂,沉不下心精雕细琢,手痒痒,迫不及待地想试一试YOLO效果.于是乎,在github上下载了ping星 ...
- EXCEL2010分成多个窗口的,解决单个窗口显示多个文档的弊病
本操作需要修改注册表,请在修改之前导出要修改的项目以备份. 1.定位到[HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open],导出保存.展开Open,将ddeexe ...
- Spring Boot 与 Spring MVC到底有什么区别
前言 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等.但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向 ...
- Hyperledger fabric-SDK-GO客户端开发篇(六)
Hyperledger fabric-SDK-GO客户端开发篇(六) Fabric-SDK-GO是提供的Go语言开发包,应用程序可以利用Fabric-SDK-GO与fabric网络进行交互并访问链码. ...
- [leetcode]207. Course Schedule课程表
在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...
- 【kinetic】操作系统探索总结(六)使用smartcar进行仿真
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify } a:link { color: r ...
- codeforces 1438D,思路非常非常巧妙的构造题
大家好,欢迎来到codeforces专题. 今天选择的问题是contest1438的D题,全场通过人数为1325人.一般在codeforces当中千人通过的题难度都不算太高,但是这题有点例外,虽然没有 ...
- Media Queries媒体查询
Media Queries能在不同的条件下使用不同的样式,使页面在不同在终端设备下达到不同的页面效果.Media Queries有其自己的使用规则.一个媒体查询由一个可选的媒体类型和媒体特性表达式,使 ...
- 杭电1720---A+B Coming(技巧:使用%x)
Problem Description Many classmates said to me that A+B is must needs. If you can't AC this problem, ...
- 【递归】P1157组合的输出
题目相关 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且 r ≤n),我们可以简单地将n个元素理解为自然数1,2,-,n从中任取r个数. 现要求你输出所有组合. ...
