荷兰国旗排序的几种解法

leetcode 排序 算法 分治


Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note:
You are not suppose to use the library's sort function for this problem.

leetcode Sort Colors

Method 1
统计各颜色出现的次数,然后重新给颜色数组赋值

 
  1. //时间复杂度 O(n),空间复杂度O(1)
  2. class Sloution {
  3. public:
  4. void sortColorts(int A[], int n) {
  5. int colors[3]={0};
  6. for( int i = 0; i < n; ++i)
  7. colors[A[i]]++;
  8. for(int i = 0, index =0; i < 3; ++i)
  9. {
  10. for(int j=0; j< colors[i]; ++j)
  11. A[index++] = i;
  12. }
  13. }
  14. }

Method 2
利用快速排序的思想,遍历,交换元素

 
  1. //时间复杂度 O(n),空间复杂度O(1)
  2. class Solution {
  3. public:
  4. void sortColors(int A[], int n) {
  5. int begin = 0, cur = 0, end = n-1;
  6. while(cur != end)
  7. {
  8. if(A[cur] == 0)
  9. {
  10. swap(A[begin],A[cur]);
  11. begin++;
  12. cur++;
  13. } else if(A[cur] == 1)
  14. {
  15. cur++;
  16. } else
  17. {
  18. swap(A[cur], A[end]);
  19. end--;
  20. }
  21. }
  22. }
  23. };

Method 3
同样维护三个指针,指向0,1,2的三个数组的起始位置。如果下一个数字是0,向右移动1,2两个指针的位置,将0放到合适的位置。移动指针时,并没有移动整个数组,只需要3个位置需要改变。 1和2同上

 
  1. //时间复杂度 O(n),空间复杂度O(1)
  2. class Solution {
  3. public:
  4. void sortColors(int A[], int n) {
  5. int i=-1,j=-1,k=-1;
  6. for(int p = 0; p < n; ++p)
  7. {
  8. if(A[p] == 0)
  9. {
  10. A[++k] = 2;
  11. A[++j] = 1;
  12. A[++i] = 0;
  13. }
  14. else if (A[p] == 1)
  15. {
  16. A[++k] = 2;
  17. A[++j] = 1;
  18. }
  19. else if (A[p] == 2)
  20. {
  21. A[++k] = 2;
  22. }
  23. }
  24. }
  25. };

Method 4
两个指针,和快排的解法一样

 
  1. //时间复杂度O(n),空间复杂度O(1)
  2. class Solution {
  3. public:
  4. void sortColors(int A[], int n) {
  5. int red = 0, blue = n-1;
  6. for (int i = 0; i < n; ++i)
  7. {
  8. if(A[i] == 0)
  9. swap(A[i++], A[red++]);
  10. else if (A[i] == 2)
  11. {
  12. swap(A[i++],A[blue--]);
  13. }
  14. else
  15. {
  16. i++;
  17. }
  18. }
  19. }
  20. };

荷兰国旗排序的几种解法相关推荐

  1. 荷兰国旗问题和快速排序

    荷兰国旗问题有两种情况:1)给定一个数x,<= x的整体放在左边,>x的整体放在右边2)给定一个数x,< x的整体放在左边,= x的整体放在中间,> x的整体放在右边规定不需要 ...

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

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

  3. 【leetcode】324.摆动排序 II (四种解法,快速排序+3way-partition等,java实现)

    324. 摆动排序 II 难度中等 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1 ...

  4. C语言 荷兰国旗解法

    /********************************************* 荷兰国旗: 1,分别定义i,j,t,i最小下标,j最大下标,t从头遍历到j的下标. 2,如果t指向的球是0 ...

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

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

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

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

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

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

  8. Java实现荷兰国旗问题

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

  9. 多图养眼!Partition,荷兰国旗问题与随机快排

    快速排序的思想是通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归方式实现,以此达到整 ...

最新文章

  1. 用Spark机器学习数据流水线进行广告检测
  2. FPGA与MCU,DSP(如C6000,C5000等)等设计思想的异同
  3. SwiftUI之深入解析布局如何自定义AlignmentGuides
  4. Mac系统下安装PIL
  5. Leecode19. 删除链表的倒数第 N 个结点——Leecode大厂热题100道系列
  6. [leetcode]112.路径总和
  7. 传递参数命令——xargs
  8. uwsgi指定python路径_uwsgi-安装实操
  9. 于数据交换格式XML和JSON的比较
  10. 浏览器访问pdf 的url怎么加密_怎么解决加密的pdf文件?
  11. Ubuntu 20.04 linux系统安装docker
  12. C#生成CHM文件(入门篇)
  13. 为什么线程切换开销大
  14. 校招| C++ 后台开发学习路线
  15. linux网易云打不开的问题
  16. 夫妻给一周岁女儿喂农药后双双自杀
  17. html5 移动端手写签名,H5移动端项目实现手写签名功能 vue实现手写签名
  18. 表贴电阻尺寸与什么有关_贴片电阻功率与尺寸对应表
  19. 鲜花绿植学生网页设计模板 静态HTML鲜花学生网页作业成品 DIV CSS网上鲜花植物主题静态网页
  20. HTC Android 系列手机 工程测试命令

热门文章

  1. 联想system x系列服务器手册,IBMSystemx系列手册.pdf
  2. 【ACM】杭电1178:Heritage from father 小心溢出!
  3. 远程控制软件向日葵等
  4. 区别:千赫kHz、兆赫MHz、吉赫GHz、太赫THz、拍赫PHz、艾赫EHz每两级之间的换算以及之间的关系
  5. 转炉炼钢计算机仿真实验报告,计算机仿真冶炼运用(共4523字).doc
  6. 2021上海益生产品(益生菌)展浅谈-益生菌对身体的21个好处
  7. 自定义Group,解决Group setVisibility后,子View再次设置setVisibility无效的问题
  8. gojs拓扑图实现节点外围圆环按钮
  9. 搭建SVN服务端及创建SVN账号
  10. 吉大 《职业生涯设计》大作业