题意: 给定一个数组,其中只含有0,1,2,对该数组排序。
条件: 一趟遍历完成排序,不使用额外的空间,不能使用编程语言自带的排序方法。
引言: 这道题正常的方法可以使用计数排序,计数排序统计数组中每个不同值出现的次数,并从小到大排列这些值,再根据计数结果重构出排序后的数组。但是本题只能遍历一趟,而且不能使用额外的空间。
分析: 本题采用的思想是将0移到数组的前面,2移到数组的后面,为此增加两个变量head和tail,head位置存放0,索引[0, …, head)的值都是0,head的初始值为0,如果A[i]=0,则交换A[i]和A[head]; tail位置存放2,索引(tail, …, A.length)的值都是2,tail的初始值为A.length-1,如果A[i]=2,则交换A[i]和A[tail]。
代码
public void sortColors(int[] A) {
int head = 0; //前指针,用来放0
int tail = A.length - 1; //后指针,用来放2
for(int i = 0; i < A.length; i++){
if(A[i] == 0 && head < i){ //把0放到前面
int temp = A[head];
A[head] = A[i];
A[i] = temp;
head++;
i--; //还是要判断当前的值
}
if(A[i] == 2 && tail > i){ //把2放到后面
int temp = A[tail];
A[tail] = A[i];
A[i] = temp;
tail--;
i--; //还是要判断当前的值
}
}
//System.out.println(Arrays.toString(A));
}