要求在遍历一遍的情况下完成排序。 由于只有三种元素,我们完全可以在遍历的同时维护两个指针分别代表0和2的个数,将遍历到的每个0放在数组前面,2放在数组后面并更新0或2的个数即可,这样在保证遍历到了每个元素的时候就可以实现要求的排序。 试想,当扫描到0时,需要将其与之前的元素交换,交换得到的元素肯定被遍历过;扫描到1时,继续,则该元素也被遍历过;扫描到2时要和之后的元素交换,交换的道德元素没被遍历过,应继续扫描这个元素直到其为0或1或是扫描完全部元素为止。
public class Solution {
public void sortColors(int[] A) {
int l = A.length;
if( l == 0 )
{
return ;
}
int st = 0,ed=l-1,i=0;
while(i<=ed)
{
if(A[i]==0)
{
A[i] = A[st];
A[st] = 0;
++st;
++i;
}
else if( A[i]==1)
{
++i;
}
else
{
A[i] = A[ed];
A[ed] = 2;
ed--;
}
}
return ;
}
}