美文网首页
彩虹排序 | 荷兰旗问题

彩虹排序 | 荷兰旗问题

作者: 码农田小齐 | 来源:发表于2020-11-09 08:27 被阅读0次

微信搜索🔍「码农田小齐」,关注这个在纽约的程序媛,回复「01-05」可以获取计算机精选书籍、个人刷题笔记、大厂面经、面试资料等资源,么么哒~

荷兰旗问题又称三色排序,或者彩虹排序,

因为荷兰旗就三种颜色嘛,那这道题的问题就是给你三种颜色,按照给定的顺序排好。

当然了,题目的问法各种各样,有的给数字,有的给字母,但本质都是一样的。

比如给你一个只含有三个数字的数组:312312312231111122113,
要求按照 1 2 3 的顺序排好,即:
111111111222222222223333333333
(请不要真的去数数,认真你就输了)

还是用我们经典的「挡板法」。

在快排中,我们用了两个挡板把数组分成三个区域:

<= pivot;未排序区间;> pivot

那么这里就要三个挡板,分成四个区域:

1, 2, 3, 未排序区间

Partition

具体说来,用 i, j, k 这三个指针分一下:
[0, i): 存 1
[i, j): 存 2

(k, array.length-1]: 存 3

这里 j 放在未排序区间的左边和右边都行,但基本上大家都是放左边,所以我们也没必要“标新立异”。

初始化:

i = 0;
j = 0;
k = array.length - 1;
这样才能保证 1,2,3 的每个区间都为空。

我们通过观察指针 j 指向的元素来不断缩小未排序区间,直到为空。

例子:1232312

为了好看,排好序的元素我们用 RGB 三原色标示一下。

Step1.

指针 j 指向 1,而 1 应该放在 [0, i) 区间内,
这里应该把指针 i 和指针 j 所指的元素交换一下,并且俩指针往前走。

虽然在这步看来是否交换没什么区别,但是如果 i 和 j 之间有元素,就有区别了,比如 Step7.

Step2.

指针 j 指向 2,而 2 应该放在 [i, j) 区间内,所以 j++.

Step3.

指针 j 指向 3,而 3 应该放在
(k, array.length-1] 区间内,所以这里
j 和 k 指向的元素交换一下,并且 k--.

注意这里就不能 j-- 了,因为新换回来的元素还没瞧呢,不知道它是几。

Step4.

指针 j 指向 2,同 Step2,直接移动指针 j 即可。

Step5.

继续移动指针 j。

Step6.

同 Step3.

Step7.

这一步就很明显看出来了,
由于 1 应该放在 [0,i) 区间,所以这里把指针 i,j 所指向的元素交换一下,并且 i++, j++.

这样未排序区间为空,我们就排好了~

时间复杂度

这个算法的 bottle neck 就在这个 while loop 里了,每次循环是 O(1),总共是 O(n).

空间复杂度

O(1)

如果你喜欢这篇文章,记得给我点赞留言哦~你们的支持和认可,就是我创作的最大动力,我们下篇文章见!

我是小齐,纽约程序媛,终生学习者,每天晚上 9 点,云自习室里不见不散!

更多干货文章见我的 Github: https://github.com/xiaoqi6666/NYCSDE

相关文章

  • 彩虹排序 | 荷兰旗问题

    微信搜索?「码农田小齐」,关注这个在纽约的程序媛,回复「01-05」可以获取计算机精选书籍、个人刷题笔记、大厂面经...

  • 【算法】快速排序及优化

    一、荷兰国旗问题 在讲快速排序前,我们先来看看荷兰国旗问题。题目如下: 其实,这就是快排的partition过程,...

  • 荷兰国旗问题(颜色排序问题)

    版权声明:本文为博主原创文章,转载请注明出处。个人博客地址:https://yangyuanlin.club欢迎来...

  • algorithm md

    算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...

  • 快排

    荷兰国旗排序图示 荷兰国旗排序code [图片上传失败...(image-cf73bb-1563555823413)]

  • 数组排序问题(二)

    目录 荷兰国旗问题 随机快排 堆排序 排序算法的稳定性及其汇总 工程中的综合排序算法 比较器的使用 桶排序、计数排...

  • 🌈彩虹旗

    在昨天之前,我从没想过彩虹旗有什么特殊的含义,直到昨天一位朋友的孩子加我微信,告诉我一些事情,我上网查了之后才知道...

  • 彩虹旗

    2015年6月26日夜里,我躺在床上,刷着微博,得知美国最高法院正式宣布同性婚姻在美国合法化,全美50个州的同性伴...

  • 彩虹旗

    LGBT标志是彩虹旗,彩虹旗倡导着爱,包容和尊重。身为LGBT一员,应该倡导彩虹声音——爱,包容,尊重。 他喜欢穿...

  • 5.荷兰旗问题(Rainbow sort)

    题目 给定一个数组{-1,1,0,-1,0,1} 数组中只有确定的3种重复元素-1,0,1,设计一个算法将其排列成...

网友评论

      本文标题:彩虹排序 | 荷兰旗问题

      本文链接:https://www.haomeiwen.com/subject/jhzkbktx.html