题目:

给定一个数组,如[1,2,3,2,3,2,1,2,3,2,1],给出一个int=2,这个值必须存在数组中,要求将数组中的元素按小于int的值在左边,等于int的值在中间,大于的在右边

问题来源:

分析:

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

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


有了上面的分析,代码就很容易理解

代码:

package mainimport ("fmt"// "math"// "sort"// "time"
)func partition(list []int,num int) []int{more:=len(list)less:=-1index:=0for  index < more{// fmt.Println("here")if list[index]<num{fmt.Printf("exchange idex  %v   less %v  ",index+1,less+1)swap(list,index,less+1)less++index++//小于去必然小于等于index,将一个小于num的的数放进小于区,不会引起小于区的混乱,//小于去已经是检查过的区域,必然符合规则,不用重新检测index位置}else if list[index]>num{fmt.Printf("exchange idx  %v  more  %v  ",index,more-1)swap(list,index,more-1)more--//大于区的数未知,放到index位置的话可能引起混乱,所以index不推进,从当前index继续检测}else{//等于什么都不做,,所以不会引起任何混乱,直接推进index检查下一位index++}fmt.Println(index)fmt.Println(list)}fmt.Println(less+1,more-1)result:=[]int{less+1,more-1}return result
}func swap(list []int,m,n int){tmp:=list[m]list[m]=list[n]list[n]=tmp
}
func main(){// list:=[]int{15, 11, 53, 2, 14, 4, 25, 27, 45, 0,30,99,2}list:=[]int{1,2,3,1,2,3,2,1,2,3,2,1,2,2}partition(list,2)}}

总结:
1 此方法类似快排的思想,但又有所不同
2 重点在于小于 等于 大于 三种条件的处理完全不同

  • 小于-因为小于区是已经排好的,并且当前index指向的值已经知道是小于的,而且index的范围,相当于小于等于区,交换实质是将小于等于区的数与小于等于区的数交换,交换后还是小于等于区,并不会引起混乱,所以直接index++推进
  • 等于-index的指针就是等于区的边界,所以无需交换,推进index
  • 大于-因为大于区的数是未知的,将当前index的数与大于区的数交换,交换过来的数有可能是大于或是小于的,因此index不能推进,要进入下一次循环重新检测index的值

less小于区,index实际相当于小于等于区

完全理解了上面的逻辑,coding才能进行下去,在此详细记录

参考

算法64-荷兰国旗问题相关推荐

  1. 【算法】荷兰国旗问题

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 文章目录 1.概述 2.问题一 2.1 暴力方法 2.2 双指针方法 1.2 问题二(荷兰国旗问题) 1 ...

  2. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

  3. 【Algorithm】算法设计与分析(第二版)- 王红梅 - JAVA / C++实现:3.9 荷兰国旗问题

    题目 : 荷兰国旗问题.要求重新排列一个由字符R,W,B(R代表红色,W代表白色,B代表兰色,这都是荷兰国旗的颜色)构成的数组,使得所有的R都排在最前面,W排在其次B排在最后.为荷兰国旗问题设计一个算 ...

  4. 各种排序算法以及扩展(选择排序,冒泡排序,插入排序,归并排序,最小和问题,堆排序,荷兰国旗问题,快速排序)

    文章目录 基础算法一二课 选择排序 冒泡排序 插入排序 判断数据是否在数组中 找满足>=value的最左位置 ^ 异或符号的多用 一.进行交换 二.数组中有一种数出现了奇数次,其他数都出现了偶数 ...

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

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

  6. 【算法习作】荷兰国旗问题

    1.问题描述:     我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组.这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗. 2. ...

  7. C++入门算法荷兰国旗

    荷兰国旗说的其实是一个二分类问题,就是红.白双球分类,同类要挨着的问题 /* Note:Your choice is C IDE */ #include "stdio.h" #de ...

  8. [算法系列之十一]荷兰国旗问题

    [问题] 现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起.这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组 ...

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

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

  10. 荷兰国旗问题(分三块)

    在说 "荷兰国旗" 问题之前,首先来看一个引例. 给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边.要求额外空间复杂度O(1) ...

最新文章

  1. Mysql备份还原数据库之mysqldump实例及参数详细说明
  2. 常用的linux故障,Linux下常用的故障排查命令行
  3. Android学习 StateMachine与State模式
  4. 【计算理论】不可判定性 ( 停机问题 | 图灵机语言是否空集问题 | 图灵机是否等价问题 | 是否存在自动机接受图灵机语言问题 | 莱斯定理 Rice‘s Theorem )
  5. include require区别
  6. 互联网分布式架构技术概述
  7. python安装matlabb库_Python调用MATLAB的方法(mlab接口库)(未总结)-Go语言中文社区...
  8. P6102-[EER2]谔运算【位运算】
  9. 夏末浅笑_2014年夏末大Java新闻
  10. centos7 yum安装ifconfig
  11. 推荐系统(7):推荐算法之基于协同过滤推荐算法
  12. 超分算法在 WebRTC 高清视频传输弱网优化中的应用
  13. 四种属性范围(重点)
  14. 牢记这一波CAD快捷键,制图速度坐火箭!
  15. EXCEL多页打印保留表头
  16. 003.关于光流传感器(ADNS3080)调焦问题
  17. Android WebView 踩坑日记,字体怎么突然变小了???
  18. lol老是闪退到桌面_lol闪退到桌面怎么解决
  19. Controllable Generation from Pre-trained Language Models via Inverse Prompting翻译
  20. PDF和CDF图的区别

热门文章

  1. Java坦克大战Summary
  2. Kali dig命令
  3. FFmpeg使用教程
  4. ISO27145协议解析
  5. 初中计算机七年级人教版目录,最新人教版初中数学目录(详细)
  6. 8年项目总结:4个G,项目经理必备模板全汇总
  7. Eclipse语言包安装
  8. AlexNet、VGG16、ResNet网络结构图
  9. 《近匠》专访机智云 CTO 刘琰——从 0 到 1 开启智能化硬件开发
  10. SPICE 协议 USB 重定向