三色排序
有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。
测试样例: [0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]
解题思路
时间复杂度为O(n),空间复杂度为O(1)
1. 类似快排的取中间值,把数值1当做中间值,进行一一对比
2. 数值等于0的放1的左边,等于2的放1的右边
import java.util.*;
public class ThreeColor {
// 数据交换
public void swap(int[] A, int a, int b){
int temp = A[a];
A[a] = A[b];
A[b] = temp;
}
// 三色排序,类似快排的获得中间值;
public int[] sortThreeColor(int[] A, int n) {
if (A == null || A.length < 1 || n < 1)
return A;
int index = 0;
int left = 0;
int right = n-1;
while (index <= right){
if (A[index] == 0){
// index加一,因为左边交换过来的值都是排序过的,无需对比
swap(A, index++, left++);
}
else if (A[index] == 2){
// index不加一,是因为右边的交换过来的值没排序过,还需再对比
swap(A, index, right--);
}
else{
index++;
}
}
return A;
}
}