深度理解:蓝白红旗问题_算法

算法思想:顺序扫描线性表,将蓝色旗交换到线性表的最前面,红色旗交换到线性表的最后面。为此,设立三个指针,其中j为工作指针,表示当前扫描的元素,i以前的元素全为蓝色,k以后的元素全为红色,根据j所指元素的颜色,决定将其交换到序列的前部或尾部。初始时,i=0,k=n-1。
notes:
1)若遍历到的位置为BLUE,则说明它一定属于前部,于是就和i位置进行交换,然后j向前进,i也向前进(表示前边的已经都排好了)。

2)若遍历到的位置为WHITE,则说明它一定属于中部,根据总思路,中部的我们都不动,然后j向前进。

3)若遍历到的位置为RED,则说明它一定属于后部,于是就和k位置进行交换,由于交换完毕后j指向的可能是属于前部的,若此时j前进则会导致该位置不能被交换到前部,所以此时j不前进。而同1),k向后退1。
#include<bits/stdc++.h>
using namespace std;
typedef enum{ RED,WHITE,BLUE
}color;
void Swap(color *a,color *b)
{
color temp;
temp = *a;
*a = *b;
*b = temp;
}
void Flag_Arrange(color a[],int n)
{
int i=0,j=0,k=n-1;
while(j<=k)
{
switch(a[j]){
case BLUE: Swap(&a[i],&a[j]);i++;j++;break;
case WHITE:j++;break;
case RED: Swap(&a[j],&a[k]);k--;
}
}
};
int main()
{
color a[6]={RED,RED,WHITE,WHITE,BLUE,BLUE};
Flag_Arrange(a,6);
for(int i=0;i<6;i++)
{
cout<<a[i];
}
}

运行效果:

深度理解:蓝白红旗问题_线性表_02