题意:一个数组保存三种颜色,分别用0,1,2表示。只能扫描一遍,将它排序。
思路:用i记录0应该放的位置,j记录2应该放的位置。
index从0到j扫描,遇到0,放在i位置,i后移;
遇到2,放在j位置,j前移;
遇到1,index后移。
扫描一遍得到排好序的数组。
时间O(n)且一次扫描,空间O(1),满足要求。
这么做的前提是,拿到一个值,就知道它应该放在哪儿。(这点和快排的根据pivot交换元素有点像)
代码:
void swap(int &a,int &b)
{
a=a^b;
b=a^b;
a=a^b;
}
void sortColors(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (n<=0||A==NULL)
return ;
int i=0;
int j=n-1;
int index=0;
while(index<=j)
{
switch(A[index])
{
case 1:
index++;
break;
case 0:
if (index>i)
swap(A[index],A[i++]);
else
{
index++;
i++;
}
break;
case 2:
if (index<j)
swap(A[index],A[j--]);
else
return;
break;
default:
break;
}
}
}