題意:把n個紅、白罗岖、藍(lán)三種不同顏色的小球涧至,亂序排列在一起,請通過兩兩交換任意兩球的方式桑包,使得從左到右小球的顏色依次為紅南蓬、白、藍(lán)哑了。紅赘方、白、藍(lán)分別用0弱左、1窄陡、2表示。
算法思想:借鑒快速排序劃分法拆火,設(shè)置三個指針——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;
}