- 问题描述
给定一个数组,只包含012三种整数,要求使数组重排后,0都在最左侧,1都在中间,2都在最右侧。 - 解决方案
- 排序,最简单粗暴的方法
public static void Partion012_1(int[] arr){
Arrays.sort(arr);
}
- 先计数,数出数组中有多少个0,多少个1,多少个2,然后再给数组赋值
public static void Partion012_2(int[] arr){
int count0 = 0;
int count1 = 0;
int count2 = 0;
for(int i = 0;i < arr.length;i ++){
if(arr[i] == 0)
count0++;
else if(arr[i] == 1)
count1++;
else count2++;
}
for(int i = 0;i < arr.length;i ++){
if(count0 > 0){
count0--;
arr[i] = 0;
}
else if(count1 > 0){
arr[i] = 1;
count1--;
}
else{
arr[i] = 2;
count2--;
}
}
}
- 参考了partition()方法的思想:在基准元素左边的元素都小于基准元素,在基准元素右边的元素都大于等于基准元素。
public static void Partion012_3(int[] arr){
int low = -1;
int high = arr.length;
int point = 0;
while(point < high){
if(arr[point] == 0)
swap(arr,++low,point++);
else if(arr[point] == 2)
swap(arr,-- high,point);
else
point ++;
}
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}