在之前总结的的快速排序算法中,用到了partition算法,故今天来总结下partition算法和其应用
partition算法,又称为荷兰国旗问题,其主要包括两个问题。

文章目录

  • 1 问题1-二分partition
    • 1.1 算法思想
    • 1.2 Python代码
  • 2 问题2-三分partition
    • 2.1 算法思想
    • 2.2 Python代码
  • 3 partition算法应用
    • 3.1 快速排序
    • 3.2 寻找数组第K大的数

1 问题1-二分partition

给定一个数组a和一个数n,把小于等于n的数字放在数组的左边,大于n的数放在数组的右边,要求额外空间复杂度O(1),时间复杂度O(n)

1.1 算法思想

1、首先定义两个下标:
下标1:less=-1,表示<=n的区域;
下标2:p=0,表示当前值所在位置。
2、接着进行判断:
1)当前值<=划分值n(也叫基准值/枢轴),则当前数与<=区域的下一个数交换,然后<=区域扩大一位(即less+1),并且当前值指针p跳下一个
2)当前值>n,则当前值指针p直接跳下一个

1.2 Python代码

###荷兰国旗问题——问题1
def partition_Q1(arr,n):less = -1p = 0while p < len(arr):if arr[p] <= n:arr[less+1],arr[p] = arr[p],arr[less+1]less += 1p += 1else:p += 1return arr

测试用例1:partition_Q1([5,3,2,5,68,1,2],4)
输出:[3, 2, 1, 2, 68, 5, 5]]
测试用例2:partition_Q1([4,5,545,4,5],3)
输出:[4, 5, 545, 4, 5]

2 问题2-三分partition

给定一个数组a和一个数n,把小于n的数字放在数组的左边,等于n的数字放中间,大于n的数放在数组的右边,要求额外空间复杂度O(1),时间复杂度O(n)

2.1 算法思想

1、此时可以定义三个下标:
下标1:less=-1,表示小于n的区域;
下标2:more=len(a),表示大于n的区域
下标3:p=0,表示当前位置
2、 判断:
1)当前值=n,p指针直接跳下一个
2)当之值<n,则当前值与<区域的后一个数交换,<区域扩大一位(即less+1),当前值指针跳下一个
3)当前值>n,则当前值与>区域的前一个数交换,>区域扩大一位(即more-1),特别注意当前指针位置不变*(与<区域交换后直接跳下一个不同的是,这里并不确定换过来的数与n的关系,所以要对该数进行判断)*
4)当前数与>区域撞上,则停止整个过程

2.2 Python代码

###荷兰国旗问题——问题2def partition_Q2(arr,n):less = -1more = len(arr)p = 0while p < more:if arr[p] < n:arr[p],arr[less+1] = arr[less+1],arr[p]less += 1p += 1elif arr[p] == n:p += 1else:arr[p],arr[more-1] = arr[more-1],arr[p]more -= 1return arr

测试用例1:partition_Q2([5,3,2,5,68,1,2],3)
输出:[2, 2, 1, 3, 68, 5, 5]
测试用例2:partition_Q2([4,5,545,4,5],3)
输出:[5, 545, 4, 5, 4]

3 partition算法应用

3.1 快速排序

见之前总结的文章

3.2 寻找数组第K大的数

使用partition算法将数组分为大于首元素的部分,等于首元素的部分和小于首元素的部分,然后判断k在那哪个部分中,递归的进行partition

代码实现

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:if not nums:return#parition分为三部分l = [i for i in nums if i > nums[0]]m = [i for i in nums if i == nums[0]]r = [i for i in nums if i < nums[0]]#判断k的位置if k <= len(l):return self.findKthLargest(l,k)elif k <= len(l) + len(m):return nums[0]else:return self.findKthLargest(r,k-len(l)-len(m))

荷兰国旗问题(partition)总结相关推荐

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

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

  2. leetcode 75. Sort Colors | 75. 颜色分类(荷兰国旗问题,快速排序)

    题目 https://leetcode.com/problems/sort-colors/ 题解 快速排序3.0(随机快排+荷兰国旗技巧优化) 在arr[L-R]范围上,进行快速排序的过程: 1)在这 ...

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

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

  4. 快速排序以及荷兰国旗问题

    荷兰国旗 要点:指针在移动时, 1.如果指针对应的值小于给定值,左标记和指针均向右移 2-如果指针对应的值等于给定值,指针右移 3-如果指针对应的值大于给定值,右标志位左移 package Test; ...

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

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

  6. 荷兰国旗问题(改造快速排序)

    本总结是是个人为防止遗忘而作,不得转载和商用. 题目 问题:现有红.白.蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起. PS:之所以叫荷兰国旗问题,是因为 ...

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

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

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

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

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

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

最新文章

  1. linux test数字txt,Linux26期 7月4日预习笔记
  2. ESXi6.7安装流程和bug处理
  3. Android JNI初试之环境搭建,最新方式的HelloWorld
  4. Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many
  5. 一个简单的DELPHI自定义事件的例子(转)
  6. CentOS系统时间同步(NTP)
  7. Py之pygame:有趣好玩——利用pygame库实现一个移动底座弹球的小游戏
  8. 全球与中国重型离合器市场运营状况分析与“十四五”发展规划建议2021年版
  9. 希尔排序python实现
  10. VSAN见证虚拟设备
  11. 对比Java和.NET多线程编程
  12. openjdk 使用_如何在OpenJDK中使用ECC
  13. 计算机主板最常见的问题,计算机主板功能 电脑实用技巧解决常见问题
  14. 雷林鹏分享:PHP MySQL 创建数据库
  15. Placement new的用法及用途【转】
  16. 都说 Linux 是吃内存大户,可你知道具体是哪些进程吃掉了吗?
  17. python判断是否含有0_Python:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0...
  18. Peta数据集识别性别
  19. 关于Oracle练习
  20. 基于RWEQ模型的土壤风蚀模数估算及其变化归因分析

热门文章

  1. 入门matplotlib—柱形图与折线图组合
  2. python中cumsum函数_python cumsum函数
  3. PHP openssl 和 JAVA 加解密
  4. 微信浏览器无法跳转到apk下载链接
  5. 1. Java实现二叉树前序遍历
  6. 手机断触怎么办_苹果二手手机该不该买?行业大咖为你解答
  7. 微信公众平台开发(二)——自定义菜单、模板消息微信素材
  8. SQL Server通过链接服务器访问Oracle
  9. 酷爱我的世界java_Minecraft我的世界Java版18w30a更新
  10. 国赛数模2017B思路汇总第二部分(题目二)