在说 “荷兰国旗” 问题之前,首先来看一个引例。

  • 给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度 O(N)

分析: 设定一个小于等于区,从0开始比较,如果当前数字小于等于num ,让其与小于等于区的下一个值做交换,再将小于等于区扩大一位,直到将所有的数字都与num进行过比较。重新排好的数组就是所求的数组。如下给出示意过程:


最终就可以得到一个在num左边所有的数都小于等于num右边都大于num。
这个过程实际上可以看成是小于等于区域在推着大于等于区域向右走,而当遇到小于等于num的数时,进行的操作是,与大于区域的第一个数字做交换,这听起来就有些像堆排序的heapify过程。

荷兰国旗问题(直观的“分三块”的问题)

—— 有了上面这些问题的基础,荷兰国旗问题就会好想一些。

  • 给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)

分析: 上一个题目要求将数组分成两块,而这个是将数组分成三块。上一个问题是在左边设置了一个大于等于区,这个问题可以在左边设置一个小于区,在右边设置一个大于区,不断向中间逼近,最终中间就是相等的数字。操作过程也和上一个问题是完全一样的。如下过程所示:


这样就将数组分成了不同条件的三块。以下给出算法代码:

  1. 在arr[L…R]范围上,根据数字p分块
  2. 小于p的在左边 等于p的在中间 大于p的在右边
  3. 返回值含义: 一定会返回一个长度为2的数组,等于区域的左边界和右边界(也就是相等区域的边界范围 )。
int* partition(int arr[],int L,int R,int p)
{int less=L-1; //小于区的右边界int more=R+1; //大于区的左边界int index=L;while(index<more){//分成三种情况讨论if(arr[index]<p) {swap(arr,++less,index++);}else if(arr[index]>p){swap(arr,--more,index);}else{index++;}}int ans[2]={less+1,more-1};return ans;
}

4.若无等于区域,此时返回值,左边界大于右边界。

将这个方法与快速排序的查找枢轴值的方法进行比较,看看有什么异同。 快速排序就是一个递归的此过程。在一定区域内进行划分,最终整体都有序。

——————————————【快速排序】· 学习笔记

还可以优化直接插入排序

  • 将数组分成两部分,前半部分有序,后半部分无序,不断地将无序区域的数字放入有序区域,插入的时候可以利用前半部分有序的特点,二分插入排序。例如如下过程:

在插入的时候,先通过二分查找确定要插入的位置,再进行插入即可。

荷兰国旗问题(分三块)相关推荐

  1. html一页内容分三块,HTML(1)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? https://mammon1113.github.io/ 制作网页离不开html,html就像是页面的骨架,必不可少, ...

  2. 过Div将页面分三块(上,中,下),然后通过Ext来改变Content的内容(三)--终结版

    2019独角兽企业重金招聘Python工程师标准>>> 这几天的页面重构终于快要结束了. 最终页面架构选择了Sitemesh,经过昨天下午及今天上午的调试终于把Sitemesh下cs ...

  3. python单链表实现荷兰国旗问题_这道荷兰旗问题,我面试时遇到三次!

    01.题目示例 "荷兰国旗问题" 是计算机科学中的一个经典题目,它是由Edsger Dijkstra提出的.荷兰国旗由红.白.蓝三色组成. 荷兰国旗问题:现在有若干个红.白.蓝三种 ...

  4. 荷兰国旗问题(三元素数组排序问题)

    荷兰国旗是红白蓝三个横条,荷兰国旗问题就是一个排序问题,这个待排数组只包含0,1,2三种元素. import randoma = [random.randint(0, 2) for i in rang ...

  5. 快速排序(由荷兰国旗问题到快排)

    文章目录 一.荷兰国旗问题 荷兰国旗解题思路 荷兰国旗代码 二.荷兰国旗到快排 时间复杂度分析 稳定性分析 一.荷兰国旗问题 在了解快排之前,我们首先了解荷兰国旗问题 给定一个数组arr,和一个整数n ...

  6. 荷兰国旗问题(partition)总结

    在之前总结的的快速排序算法中,用到了partition算法,故今天来总结下partition算法和其应用 partition算法,又称为荷兰国旗问题,其主要包括两个问题. 文章目录 1 问题1-二分p ...

  7. 荷兰国旗 Flag of the Kingdom of the Netherlands

    问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...

  8. 算法练习day4——190321(小和、逆序对、划分、荷兰国旗问题)

    归并排序快的原因: 后面的排序利用了前面排序的结果!!! 1.小和问题 在一个数组中, 每一个数左边比当前数小的数累加起来, 叫做这个数组的小和. 求一个数组的小和. 例子:[1,3,4,2,5] 1 ...

  9. c语言不定长数组_学习C语言这三块“硬骨头”不搞定学了也是白学

    C语: C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块"难啃的硬骨头"几乎是公认级别的. 01指针 C语言 指针公认最难理解的概念,也是让很多初学 ...

最新文章

  1. PHP多图片上传 并检查 加水印 源码
  2. 1.JSONObject与JSONArray的使用
  3. django 动态更新属性值
  4. aspx后缀映射成html
  5. Java web 部分
  6. 4.2.1 磁盘的结构
  7. 链式队列的实现(头文件及源程序)
  8. 铁乐学python_Day42_锁和队列
  9. MySQL 索引类别与索引使用指南
  10. mysql的int多少溢出_mysql 整型(int)数字溢出在程序和数据库设计中的考虑
  11. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认...
  12. C++_结构体的定义和使用_结构体数组---C++语言工作笔记025
  13. Java判断Class变量是什么类型
  14. gpio stm8 管脚 配置工具_STM8S 外设模块的GPIO引脚应该如何配置
  15. 【系统架构】VC 开发辅助工具大收集
  16. 全球DEM下载 90米、30米、12.5米等各种精度DEM数据
  17. MTK FM收音机修改门限减少杂台
  18. 计算机的硬件软件组成
  19. 计算机连接拒绝访问,打印机拒绝访问,手把手教你打印机拒绝访问无法连接
  20. 世界卫生组织健康标准

热门文章

  1. 搭建Android的jenkins持续集成环境
  2. Java程序性能优化10
  3. 卡巴斯基发现新型恶意软件StoneDrill,或与 Shamoon有关
  4. 《敏捷软件开发-原则、方法与实践》-Robert C. Martin
  5. 再说409,又提离别痛
  6. Docker部署安装MongoDB
  7. IDEA 设置自动导入包,以及手动导入包
  8. Hibernate一对一映射示例注释
  9. 消息队列面试 - 如何保证消息的顺序性?
  10. typescript 博客_如何使用Typescript自动化博客发布过程