题意:把n个红、白、蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两球的方式,使得从左到右小球的颜色依次为红、白、蓝。红、白、蓝分别用0、1、2表示。
算法思想:借鉴快速排序划分法,设置三个指针——begin、middle、end,分别指向0、1、2。
#include <stdio.h>
void swap(int * a, int * b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
freopen("in.txt", "r", stdin);
int n, buf[100];
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; ++i)
scanf("%d", &buf[i]);
int begin, middle, end;
begin = middle = 1;
end = n;
while(middle <= end)
{
if(buf[middle] == 0)
{
swap(&buf[begin], &buf[middle]);
begin++;
middle++;
}
else if(buf[middle] == 2)
{
swap(&buf[middle], &buf[end]);
end--; //end可能指向0,所以middle不可以右移
}
else
middle++;
}
for(int i = 1; i <= n; ++i)
printf("%d ", buf[i]);
printf("\n");
}
return 0;
}