项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.问题

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

2.解法一之计数排序

计数排序的思路比较简单,就是得到各个元素出现的次数,然后重新写入原来的数组中。
直接上代码

    public static void sortColorsOnCardinality() {int[] colors = {0, 1, 2, 0, 1, 2, 0, 0, 2, 2, 1};int count0= 0, count1 = 0, count2 = 0;for(int num: colors) {if (num == 0) count0++;else if (num == 1) count1++;else count2++;}for(int i=0; i<colors.length; i++) {if (i < count0) {colors[i] = 0;} else if (count0 <= i && i < count0 + count1) {colors[i] = 1;} else {colors[i] = 2;}}}

很容易分析出计数算法的时间复杂度为O(2n),要对原数组遍历两遍。

3.解法二之三路快排

上面的算法需要遍历两遍数组,能不能遍历一遍就搞定?答案是可以的,三路快排就可以搞定。
回忆一下快速排序的思想:每次选定一个pivot之后,将大于pivot的元素放一边,将小于pivot的元素放另外一边,递归最后可以使整个序列有序。
快排的平均时间复杂度为 nlogn。当数组基本有序或者数组中大量元素相等时,时间复杂度会退化到n^2。这个时候可以采取三路排序的思想:普通的快排是将序列分成了两部分,现在分成三部分,分别是大于pivot,等于pivot,小于pivot。
先看代码

    public static void sortColors() {int[] colors = {0, 1, 2, 0, 1, 2, 0, 0, 2, 2, 1};int left = 0;int right = colors.length - 1;int i = 0;while (i <= right) {if (colors[i] == 0) {swap(colors, i, left);left++;i++;} else if(colors[i] == 1) {i++;} else {swap(colors, i, right);right--;}}}public static void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

其中,left是记录第一个1出现的位置,left的左边为0,右边为1,而right则是记录的第一个不是2出现的位置,这样right右边的数字就全是2。
i的作用是遍历数组,遍历的时候有三种情况:
1.如果数字是0,则将colors[i]与colors[left]元素互换,这样保证left之前的元素均为0,同时left与i同时加1。
2.如果数字为1,这个时候i指针加1。
3.如果数字为2,将colors[i]与colors[right]互换,这样保证数字2去了数组的右边,同时right减1,表示这个时候right右边的数字已经全为2。

sort colors 三色排序相关推荐

  1. LeetCode 75 Sort Colors(颜色排序)

    翻译 给定一个包括红色.白色.蓝色这三个颜色对象的数组.对它们进行排序以使同样的颜色变成相邻的,其顺序是红色.白色.蓝色.在这里,我们将使用数字0.1和2分别来代表红色.白色和蓝色. 原文 Given ...

  2. php 三色排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,第2章 排序 | | 第17节 三色排序练习题...

    1.思路: 1.1思路1: 第一眼看到这样的题目,会举得非常简单,只需要两次遍历数组就可以完成了.第一次遍历,扫描数组中的元素,每次遇到0则count0++,遇到1则count1++,遇到2则coun ...

  3. 82 颜色分类II-彩虹排序(Sort Colors II)

    文章目录 1 题目 2 解决方案 2.1 思路 2.2 图解 2.3 时间复杂度 2.4 空间复杂度 3 源码 1 题目 题目:颜色分类II(Sort Colors II) 描述:给定一个有n个对象( ...

  4. 【排序】LeetCode 75. Sort Colors

    LeetCode 75. Sort Colors Solution1: 参考自:<leetcode-cpp 答案> 由于0,1,2非常紧凑,首先想到计数排序(counting sort), ...

  5. [LeetCode]75.Sort Colors

    [题目连接] 75.Sort Colors [题目] Given an array with n objects colored red, white or blue, sort them so th ...

  6. 面试前你必须知道的三个排序算法

    今天分享的是三种排序算法,在面试.实际编程中经常会碰到和使用到的,我会带领大家从分析排序算法技巧上以及代码实现上全面理解这一知识点的掌握. 一.如何分析一个「排序算法」 1. 执行效率 ① 最好.最坏 ...

  7. python工资津贴的计算和排序-python sort、sorted高级排序技巧

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...

  8. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  9. 75. Sort Colors - LeetCode

    Question 75. Sort Colors Solution 题目大意: 给一个数组排序,这个数组只有0,1,2三个元素,要求只遍历一遍 思路: 记两个索引,lowIdx初始值为0,highId ...

  10. 二维数组排序php array_work,Arrays.Sort()中的那些排序算法

    本文基于JDK 1.8.0_211撰写,基于java.util.Arrays.sort()方法浅谈目前Java所用到的排序算法,仅我的看法和笔记,如有问题欢迎指证,着重介绍其中的TimSort排序,其 ...

最新文章

  1. js中定义变量之②var let const的区别
  2. SQL2008 附加数据库提示 5120错误
  3. UA MATH563 概率论的数学基础 中心极限定理24 随机变量的特征函数
  4. 已解决 问题ModuleNotFoundError: No module named ‘tensorflow.examples.tutorials‘
  5. 【Android】动态更新Icon
  6. linux kvm百度云,容器与云|如何在 Ubuntu Linux 上使用 KVM 云镜像
  7. android 解码webp动画,android webp编解码详解
  8. MyCat分布式数据库集群架构工作笔记0006---Mycat启动
  9. 【机器学习】隐马尔可夫模型及其三个基本问题(三)模型参数学习算法及python实现
  10. vmware 下centos7配置网络
  11. 华为设备OSPF配置命令
  12. C语言求三角形的角的大小,c语言求三角形的面积及判断三角形类型
  13. mysql error1682_mysql5.7报错 1546、1577和1682问题分析
  14. 调用Yahoo API监控外汇汇率
  15. 计算机学院软件设计比赛作品,计算机学院成功举办首届软件设计大赛
  16. 电子计算机off键是什么意思,off键是什么意思
  17. gentoo php,Gentoo安装php7
  18. MSDN2015下载与安装
  19. 【水汐のpython】 用python抓取外网的本子站并获取本子封面和信息
  20. 奇偶校验的快捷判断方法---按位异或

热门文章

  1. Centos7.4 部署DHCP服务
  2. disruptor:CAS实现高效(伪)无锁阻塞队列实践
  3. 保持新投资技术先进性和保护既有投资的完美均衡 —— 成都地铁4号线二期PIS车地无线通信...
  4. vim忽略大写和小写查找配置
  5. scvmm管理hyper-v克隆主机(二)
  6. 数字 三位一节(逗号隔开)表示
  7. 穷人和富人在处事方式上的区别
  8. Hystrix断路器---SpringCloud(四)
  9. Python3学习笔记18-访问限制
  10. 【爬虫系列之三】URLError异常处理以及Cookie的使用