/*
三色旗问题:
假设有一个数组,它有n个元素,每一个不外乎是红,白,蓝3种颜色之一的代号,就用R,W,B代表。这些元素在数组中并没有依同样颜色的元素排在一起的方式来排列,请写一个程序把这些元素排成所有蓝色在前,接着是白色,最后是红色的排列方式,不过在写程序时要满足下面的条件:
(1)不能用额外的内存,换句话说,只能在数组之内用互换的方式完成。
(2)互换两个元素的动作要越少越好。
(3)对于每一个元素而言,测试它是红,是白,还是蓝的工作每种颜色最多只能做一次测试。
在这个条件下,请写一个最快的程序。
假设有一个数组,它有n个元素,每一个不外乎是红,白,蓝3种颜色之一的代号,就用R,W,B代表。这些元素在数组中并没有依同样颜色的元素排在一起的方式来排列,请写一个程序把这些元素排成所有蓝色在前,接着是白色,最后是红色的排列方式,不过在写程序时要满足下面的条件:
(1)不能用额外的内存,换句话说,只能在数组之内用互换的方式完成。
(2)互换两个元素的动作要越少越好。
(3)对于每一个元素而言,测试它是红,是白,还是蓝的工作每种颜色最多只能做一次测试。
在这个条件下,请写一个最快的程序。
*/
#include "stdio.h"
#include "time.h"
#define N 100
#define BLUE 1
#define WHITE 2
#define RED 3
#define SWAP(x,y) {int t;t=flag[x];flag[x]=flag[y];flag[y]=t;}
void Swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void main()
{
int flag[N];
int wFlag;
int bFlag;
int rFlag;
int i;
#include "time.h"
#define N 100
#define BLUE 1
#define WHITE 2
#define RED 3
#define SWAP(x,y) {int t;t=flag[x];flag[x]=flag[y];flag[y]=t;}
void Swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void main()
{
int flag[N];
int wFlag;
int bFlag;
int rFlag;
int i;
//初始化索引值
wFlag = bFlag = 0;
rFlag = N-1;
//初始化旗子
for (i=0;i<100;i++)
{
flag[i] = i*4%3+1;
printf("%3d",flag[i]);
}
printf("\n");
//排序
while (wFlag <= rFlag)
{
if (flag[wFlag] == WHITE)
{
wFlag++;
}
else
{
if (flag[wFlag] == BLUE)
{
SWAP(bFlag,wFlag);
wFlag++;
bFlag++;
}
else
{
while (wFlag<rFlag && flag[rFlag] == RED)
{
rFlag--;
}
SWAP(rFlag,wFlag);
rFlag--;
}
}
}
//输出旗子
for (i=0;i<100;i++)
{
printf("%3d",flag[i]);
}
wFlag = bFlag = 0;
rFlag = N-1;
//初始化旗子
for (i=0;i<100;i++)
{
flag[i] = i*4%3+1;
printf("%3d",flag[i]);
}
printf("\n");
//排序
while (wFlag <= rFlag)
{
if (flag[wFlag] == WHITE)
{
wFlag++;
}
else
{
if (flag[wFlag] == BLUE)
{
SWAP(bFlag,wFlag);
wFlag++;
bFlag++;
}
else
{
while (wFlag<rFlag && flag[rFlag] == RED)
{
rFlag--;
}
SWAP(rFlag,wFlag);
rFlag--;
}
}
}
//输出旗子
for (i=0;i<100;i++)
{
printf("%3d",flag[i]);
}
}