终于来了排序的算法了,但是和普通的排序还有点差异
说明:假设一条绳上有红、白、蓝三种颜色的棋子,按照蓝白红排列,需要移动次数最少,只能在绳子上进行,并且一次只能移动两个。
其实要实现功能很多做法,但是要次数最少,额,那就需要移动有些技巧:
我们需要三个变量例如WFlag,BFlag,RFlag
如果当前位置到了白色,则当前位置W+1
如果到了蓝色,W和B交换位置后,W和B都加1
如果遇到红色,我们需要判断R记录的是否为红色,如果不是红色,则交换位置,R--
思想:总结一下,遇到红色,我们需要将红色向后放,遇到蓝色,交换蓝色向前放,三个标志位记录的即位置。
还是模模糊糊,上代码就清楚了
我们肯定需要交换的代码,就不列了,
加入是Swap(A, B)
核心:
例如:
#define BLUE 'b'
#define WHITE 'w'
#define RED 'r'
char color[] = {'r', 'w', 'b', 'w', 'w', \
'b', 'r', 'b', 'w', 'r', '\0'};
int wFlag = 0;
int bFlag = 0;
int rFlag = strlen(color) - 1;
int i;
while(wFlag <= rFlag) {
if(color[wFlag] == WHITE)
wFlag++;
else if(color[wFlag] == BLUE)
{
SWAP(bFlag, wFlag);
bFlag++; wFlag++;
}
else
{
while(wFlag < rFlag && color[rFlag] == RED)
rFlag--;
SWAP(rFlag, wFlag);
rFlag--;
}
}
这种需求也就玩玩