有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。
给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。
[0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]
import java.util.*;
public class ThreeColor {
public int[] sortThreeColor(int[] A, int n) {
int zeroAreaIndex = -1;//0区域当前最后位置
int twoAreaIndex = n;//2区域当前最前位置
for(int i=0; i<A.length; ){
if(A[i] == 1) i++;
else if(A[i] == 0){
swap(A, ++zeroAreaIndex, i);//当前位置为0,和0区域的下一个位置进行交换(0 0 0 1 0 2 0 1)
i++;
}
else{//当前位置为2,那么和2区域的前一个位置进行交换(0 0 0 1 2 1 1 1 0 2)
swap(A, --twoAreaIndex, i);
if(i == twoAreaIndex) break;
/**
* 此时从2区域前方交换到了当前i位置,不知道2区域前方这个数是1还是2还是0?
* 如果是1的话,i++,继续下一次循环;
* 如果是0或者2的话,i保持不变
*/
else continue;
return A;
public void swap(int[] arr, int m, int n) {
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;