荷兰国旗问题

本文探讨了荷兰国旗问题的三种解决方案,包括基数排序思想的算法一,通过减少空间使用的算法二,以及仅使用两个栈的算法三。每种算法都分析了其优缺点,例如时间复杂度、空间复杂度和实现难度。
摘要由CSDN通过智能技术生成

刚才在严蔚敏的数据结构习题上看到的这个题。看了几篇博客。貌似都没有结合数据结构的意思来解释。

让我有种冲动写篇文章。。就把这当作我的第一篇博文吧。

 

问题描述:

荷兰国旗问题 ,设有一个仅有红白蓝三种颜色的条块组成的条块序列。请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗的图案。

 

解析:

算法一:

首先复杂度为O(n)。这很容易让人想到扫一遍然后放入3个栈中。这样空间复杂度就为O(3*n)。

其实这种算法用到了基数排序的思想。先设置判断条件。把符合条件的放入相应栈中,然后按序取出。

虽然看上去算法不稳定。由于只有颜色这一种区分,所以取出的顺序可以随便取。

优点:

容易想到。实现不复杂,只用设置3个栈,并且标号就行了。

缺点:

空间浪费大。而实际上元素移动的次数为2n。比下面说到的方法要多。

 

 

算法二:

有了算法一,我们能不能缩小空间的使用呢?答案是可以。

因为简单一看。如果我们把栈设在原始的数组中的话。是不是就可以节约3n的空间了?

那么怎样把栈塞到原始数组中呢?其实只用多扫描一遍原始数组就可以了。记录下rflag wflag bflag的次数就可以了!

如此以来。3个flag变量就成了栈的top变量了!

然后开始扫描3个变量的位置,如果是对应相同,那么就自加。如果不是,就找当前位置的颜色放到对应的栈中。

比方说红色栈顶事蓝色。那么就和对应的bfla

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值