算法--三色排序(经典的荷兰国旗问题)
2017-03-11 22:58
239 查看
三色排序
![](https://images2015.cnblogs.com/blog/1008304/201703/1008304-20170311225810857-1544639196.jpg)
![](https://images2015.cnblogs.com/blog/1008304/201703/1008304-20170311225811264-1487005883.jpg)
![](https://images2015.cnblogs.com/blog/1008304/201703/1008304-20170311225811623-1217381584.jpg)
第17节 三色排序练习题
有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。
测试样例:
[0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]
Java (javac 1.7)
代码自动补全
1
import java.util.*;
2
3
public class ThreeColor {
4
public int[] sortThreeColor(int[] A, int n) {
5
int zeroAreaIndex = -1;//0区域当前最后位置
6
int twoAreaIndex = n;//2区域当前最前位置
7
for(int i=0; i<A.length; ){
8
if(A[i] == 1) i++;
9
else if(A[i] == 0){
10
swap(A, ++zeroAreaIndex, i);//当前位置为0,和0区域的下一个位置进行交换(0 0 0 1 0 2 0 1)
11
i++;
12
}
13
else{//当前位置为2,那么和2区域的前一个位置进行交换(0 0 0 1 2 1 1 1 0 2)
14
swap(A, --twoAreaIndex, i);
15
if(i == twoAreaIndex) break;
16
/**
17
* 此时从2区域前方交换到了当前i位置,不知道2区域前方这个数是1还是2还是0?
18
* 如果是1的话,i++,继续下一次循环;
19
* 如果是0或者2的话,i保持不变
20
*/
21
if(A[i] == 1) i++;
22
else continue;
23
}
24
if(i == twoAreaIndex) break;
25
}
26
return A;
27
}
28
29
public void swap(int[] arr, int m, int n) {
30
int temp = arr[m];
31
arr[m] = arr[n];
32
arr[n] = temp;
33
}
34
}
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例
相关文章推荐
- 三色排序问题/(荷兰国旗问题)(C++版)
- 三色排序(荷兰国旗问题)
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序、桶排序、相邻两数的最大差值问题、工程中的综合排序算法
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序
- 左神算法课程系列--荷兰国旗问题
- 排序相关——荷兰国旗问题
- 三色棋问题(荷兰国旗问题)
- 查找排序实战---荷兰国旗问题(leetcode 75)
- 荷兰国旗问题(三元素数组排序问题)
- 算法谜题123 荷兰国旗问题
- 荷兰国旗问题的算法实现
- 奇偶数排序,荷兰国旗问题
- 荷兰国旗问题(三元素数组排序问题)
- [置顶] 75. Sort Colors--荷兰三色国旗问题
- 算法学习-荷兰国旗问题
- 经典算法之排序问题(二):桶排序、鸽巢排序
- [算法系列之十一]荷兰国旗问题
- 数组------荷兰国旗问题(颜色排序)
- 荷兰国旗问题--快速排序的变种
- 荷兰国旗排序问题对应的快速排序方法