Dutch N.F. 荷兰国旗问题,是一类分类的问题。需要在给定的一个集合中,将三类点分开。
问题描述
我们在集合中给定了三类点,分别是red,white,blue,分别用1,2,3表示。我们需要将这三类点按照一定的顺序进行排序,最后让排序后的点组成荷兰国旗。
即,给定了集合{1,2,3,2,1,2,3,2,1,2,3,3,2,1,1,1,2,3,2,1,2,3,1,2,…}我们需要将其整理成为{1,1,…,2,2,…3,3,…}。本质上来讲是一个分类的问题。
思考
快速排序
首先这类问题同样也可以看做一类排序的问题,利用快速排序的方法,同样可以得到分类的过程,但是我们仅仅需要对一个大类进行区分,而快排则将所有的数字都进行了一次排序,做了一些额外的工作,直观上来讲并不是最合适的方法,但是其O(nlogn)的复杂度是可以接受的。
桶排序
有同学可能会想到,我们用桶排序就可以达到O(n)的时间复杂度,但是在某些情况我们用1,2,99999来表示分类,那么空间的开销将会非常大,因此这也不是很合适的解。
Dutch N.F分类算法
本文将介绍Dutch N.F分类算法,该算法可以在O(n)的时间复杂度,O(1)空间复杂度情况下解决这个问题。
Dutch N.F 算法
Dutch N.F算法的精髓在于分区,增长。记住这