三色旗问题最早由荷兰人E.W.Dijkstra提出,他所使用的用语为Dutch Nation Flag,而多数的作者则使用Three-Color Flag来称之。
问题描述如下:
一条绳子上面挂有红、白、蓝三种颜色的旗子,由于旗子的颜色是随机的,现需要使其变为按照蓝、白、红三种颜色进行顺序排列,旗子只能在绳子上面移动,并且每次只能调换其中两只旗子的位置。如何才能使用最少的调动次数来完成排序?
解题思路:
①每次调换两个旗子的位置,从全局视角看,应当尽可能使得蓝色旗子向前移动并且不需要再次移动,而红色旗子向后移动并且不需要再次移动,由此我们可以想到最好能保存好前面已经调整好顺序的蓝色旗子最后一个蓝色旗子的下标和从后往前看最靠前的已经排好顺序的红色旗子的下标;
由此设想,我们可以选择双指针来指定这两个位置。