算法思想:题目要求对给定的一组旗子序列按蓝白红顺序排序,序列中蓝白红分别用B、W、R表示,首先肯定需要一个字符数组存储用户给定序列,其次需要三个"指针"用于遍历序列过程中的交换操作,具体设定b、w、r指针,开始时让b和w指针指向首元素,我们用w来遍历,b指针等到需要交换时才移动,r指向末元素,这样指向的目的在于题目要求的输出序列为蓝白黄,自然指向蓝的指针只有当w指针指向蓝时才会b与w指针交换,白作为中间元素,当用w遍历时如果是白则自动++,以此来保证中间的全是白,b的左边包括b全是蓝,当w为红是自然与r交换,但交换的时候需要记得让r从后往前指向一个非红,然后将w指向的红与r指向非红交换,交换后r自然要-1以便进行下一次的交换,如果r指向的一直为红,则r一直自减到了r等于w时证明结束了,因为此时w指向的也是红,证明序列已经排好了,算法的最外层循环条件应设为w<=r的目的在于当w等于r时处理的是最后一个元素,若只写w<r可能少处理一个元素
#include<stdio.h>
#include<string.h>
int main()
{
char color[10];
printf("请输入旗子序列(B、R、W\n");
gets_s(color);//输入9个字符,因为gets_s函数自动添'\0'
int w, r, b;
char temp;
w = b = 0;
r = strlen(color) - 1;//r指向最后一个字符
while (w<=r)//关键点
{
if (color[w] == 'w')
{
w++;
}
else if (color[w] == 'b')
{
temp = color[w];
color[w] = color[b];
color[b] = temp;
b++;
w++;
}
else
{
while (color[r] == 'r'&&r>w)//关键点
{
r--;
}
temp = color[r];
color[r] = color[w];
color[w] = temp;
r--;
}
}
printf("%s\n", color);
return 0;
}