Dutch National Flag 问题

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算法的精髓在于分区,增长。记住这

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值