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

2 解决方案
为了方便编码与讨论,用数字0表示红球,数字1表示白球,数字2表示蓝球,所以最后生成的排列为0,1,2。

解决该问题,只需先设定三个用于指定元素的下标指针(PS:在Java中没有指针,此处方便描述):一个前指针begin,一个中指针current,一个后指针end。Current指针遍历整个数组序列:

(1)当current指针所指元素为0时,与begin指针所指的元素交换,而后current++,begin++;

(2)当current指针所指元素为1时,不做任何交换,而后current++;

(3)当current指针所指元素为2时,与end指针所指的元素交换,而后current指针不动,end–.

那么,为什么在上述第(3)步中,current指针不动?因为如果end所指元素为0时,此时current指针就不能动。

package com.liuzhen.array_2;public class HollandFlagProblem {//输出荷兰国旗问题后的排序结果,时间复杂度为O(n),空间复杂度为O(1)public void getHollandSort(int[] A){int begin = 0;int current = 0;int end = A.length - 1;while(current <= end){//值得注意的是:此处if语句是使用if-else if-else if,而没有使用if-if-if。这样使用保证每一次循环只执行一个条件,//否则,若使用if-if-if,可能会形成一次循环执行两到三个if条件,造成最终结果错误(PS:即在循环结束前,发生current > end)if(A[current] == 0){swap(A,begin,current);begin++;current++;}else if(A[current] == 1)current++;    else if(A[current] == 2){swap(A,current,end);end--;}}//输出排完序后的数组A相应元素System.out.println("对数组A进行划分后的元素顺序为:");for(int i = 0;i < A.length;i++)System.out.print(A[i]+" ");}//交换数组A中m位置和n位置上元素的值public void swap(int[] A,int m,int n){int temp = A[m];A[m] = A[n];A[n] = temp;}public static void main(String[] args){HollandFlagProblem test = new HollandFlagProblem();int[] A = {2,0,2,0,0,2,1,1,0,2,1,0,1,2,0,1,2,0,1,0,2,1,0,2,0,1,2,0,1,2,0,2,1,0};test.getHollandSort(A);}
}

运行结果:

对数组A进行划分后的元素顺序为:
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2

Java实现荷兰国旗问题相关推荐

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

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

  2. python单链表实现荷兰国旗问题_快速排序深入之荷兰国旗问题

    一.序言 在使用partition-exchange排序算法时,如快速排序算法(即使选择了一个好的关键元素pivot values),我们往往面临一个很尴尬的境地--当排序对象中有很多重复的元素,pa ...

  3. 切分数组--荷兰国旗问题

    package org.buptdavid.datastructure.zj.zuo_shen;import java.util.Arrays;/*** @author root* @CalssNam ...

  4. 荷兰国旗、quillksort

    quilksort v3.0版本,时间复杂度O(NlogN),基于荷兰国旗问题. 时间复杂度:随机选取一个数组内的数作为target,时间复杂度分析使用master公式(递归). JAVA代码: im ...

  5. 荷兰国旗问题的解决:额外空间复杂度O(1),时间复杂度O(N)

    荷兰国旗问题:Dutch National Flag Problem a.给定一个序列arr,和一个数字num,把 > num的放在数组右边,把 <= num的放在数组左边         ...

  6. 荷兰国旗问题(Dutch National Flag Problem)

    问题描述 给定数组中只有"1","2","3"三种数字,且个数不等 排序 最终结果的顺序为:所有的1在前,所有的2在中间,所有的3在后 如: ...

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

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

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

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

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

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

最新文章

  1. 微信小程序惩治“老赖” 河北高院“老赖地图”上线
  2. leetcode232. 用栈实现队列
  3. 查找练习 hash——出现过的数字
  4. layui表单加文件 php_layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例...
  5. 小白学测试(基础知识)
  6. 图像质量评价(Image Quality Assessment,IQA)
  7. 寻找最佳特征维度_寻找5种最佳设计模式书
  8. 微信小程序之保存图片到手机相册
  9. 嵌入式Linux应用开发
  10. 最详细的vue安装教程
  11. 工业机器人pallet指令_对《工业机器人编程指令详解》的详细介绍
  12. ppt 母板 如何修改你的背景图片
  13. 五笔86和汉字对照表
  14. 电脑应用程序分身双开及多开(能记住账号和密码)
  15. centos linux系统日志分析,CentOS 7日志分析详解【二】
  16. STM32开发 -- RTC详解
  17. games java mtech_JEIL MTECH打号机打码机
  18. java 浮雕效果_android 图像处理(黑白,模糊,浮雕,圆角,镜像,底片,油画,灰白,加旧,哈哈镜,放大镜)...
  19. 一体化红外接收头有两种
  20. 将26个字母输入mysql_做mysql字母

热门文章

  1. mysql数据库中 join 和 left join 的区别
  2. RK3399平台开发系列讲解(PCI/PCI-E)5.55、PCIE RC枚举EP过程
  3. 在ASP中实现RsA加密与解密
  4. 安装了 PowerBuilder 10 Enterprise 玩玩...
  5. Linux系统软件安装 Jdk MySQL Tomcat
  6. AI大语音(十)——N-gram语言模型(深度解析)
  7. NLP.TM[36] | NLP之源:n-gram语言模型
  8. UE4 SetVisibility()和SetHiddenInGame()的比较
  9. Fortran写nc文件nbsp;f90nbsp;netcdf
  10. 一个简单的在线md5验证工具的实现