您的位置:首页 > 其它

算法--三色排序(经典的荷兰国旗问题)

2017-03-11 22:58 239 查看

三色排序







第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

}


您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: