有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。
给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。
测试样例:
[0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]
可以用两个变量left和right分别代表0和2的阵营
代码如下:
public int[] sortThreeColor(int[] A, int n) {
int left=-1;
int right=A.length;
int i=0;
while(i<right){
if(A[i]==0){
//将0阵营的用left来表示出并用i++指向下一个元素;
swap(A,i,++left);
i++;
}else if(A[i]==2){
//为什么这里不用i++
//是因为当前元素等于2时,交换最后一个元素和当前元素
//这时只能判断最后一个是2并且是2阵营的
//当时交换的最后一个元素不一定是2所以又要继续判断一次
swap(A,i,--right);
}else{
i++;
}
}
return A;
}
public void swap(int[] a, int i, int j) {
if(i!=j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}