基本思想

通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

实现原理

整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。

Partition函数

首先,先写partition模板

def partition(nums, left, right):pivot = nums[left]#初始化一个待比较数据i,j = left, rightwhile(i < j):while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数j-=1nums[i] = nums[j] #将更小的数放入左边while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数i+=1nums[j] = nums[i] #将更大的数放入右边#循环结束,i与j相等nums[i] = pivot #待比较数据放入最终位置 return i #返回待比较数据最终位置

快速排序

#快速排序
def quicksort(nums, left, right):if left < right:index = partition(nums, left, right)quicksort(nums, left, index-1)quicksort(nums, index+1, right)arr = [1,3,2,2,0]
quicksort(arr, 0, len(arr)-1)
print(arr)

topk切分

将快速排序改成快速选择,即我们希望寻找到一个位置,这个位置左边是k个比这个位置上的数更小的数,右边是n-k个比该位置上的数大的数,我将它命名为topk_split,找到这个位置后停止迭代,完成了一次划分。

def topk_split(nums, k, left, right):#寻找到第k个数停止递归,使得nums数组中index左边是前k个小的数,index右边是后面n-k个大的数if (left<right):index = partition(nums, left, right)if index==k:return elif index < k:topk_split(nums, k, index+1, right)else:topk_split(nums, k, left, index-1)

获得前k小的数

#获得前k小的数
def topk_smalls(nums, k):topk_split(nums, k, 0, len(nums)-1)return nums[:k]arr = [1,3,2,3,0,-19]
k = 2
print(topk_smalls(arr, k))
print(arr)

获取第k小的数

#获得第k小的数
def topk_small(nums, k):topk_split(nums, k, 0, len(nums)-1)return nums[k-1] #右边是开区间,需要-1arr = [1,3,2,3,0,-19]
k = 3
print(topk_small(arr, k))
print(arr)

获得前k大的数

#获得前k大的数
def topk_larges(nums, k):#parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-kreturn nums[len(nums)-k:] arr = [1,3,-2,3,0,-19]
k = 3
print(topk_larges(arr, k))
print(arr)

获得第k大的数

#获得第k大的数
def topk_large(nums, k):#parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-kreturn nums[len(nums)-k] arr = [1,3,-2,3,0,-19]
k = 2
print(topk_large(arr, k))
print(arr)

只排序前k个小的数

#只排序前k个小的数
#获得前k小的数O(n),进行快排O(klogk)
def topk_sort_left(nums, k):topk_split(nums, k, 0, len(nums)-1) topk = nums[:k]quicksort(topk, 0, len(topk)-1)return topk+nums[k:] #只排序前k个数字arr = [0,0,1,3,4,5,0,7,6,7]
k = 4
topk_sort_left(arr, k)

只排序后k个大的数

#只排序后k个大的数
#获得前n-k小的数O(n),进行快排O(klogk)
def topk_sort_right(nums, k):topk_split(nums, len(nums)-k, 0, len(nums)-1) topk = nums[len(nums)-k:]quicksort(topk, 0, len(topk)-1)return nums[:len(nums)-k]+topk #只排序后k个数字arr = [0,0,1,3,4,5,0,-7,6,7]
k = 4
print(topk_sort_right(arr, k))

作者:jun-lin-w
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/ji-yu-kuai-pai-de-suo-you-topkwen-ti-jia-ylsd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢:

【Leetcode】大神总结的所有TopK问题模板(基于快速排序)相关推荐

  1. 空间素材代码_C++大神解读视频捕获程序,VC++基于Directx开发的源代码

    一款小巧的视频捕获程序,VC++6.0基于Directx开发的源代码,编译时需要Directx相关类库文件, 窗口表单编写的简单视频捕捉应用程序.这个工程既演示了窗口表单应用程序的创建,又演示了 Op ...

  2. [LeetCode]LRU Cache有个问题,求大神解答【已解决】

    题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  3. LeetCode github集合,附CMU大神整理笔记

    Github LeetCode集合 本人所有做过的题目都写在一个java项目中,同步到github中了,算是见证自己的进步.github目前同步的题目是2020-09-17日之后写的题.之前写过的题会 ...

  4. 如何在大学里成为IT技术大神?

    阅读本文大概需要 20 分钟. 写在前面 前文回顾:机器学习实战--住房月租金预测(2) 这篇文章并非原创,在大一的时候完全是被标题所吸引,好在文章没有让自己失望,现在回顾自己学习编程的日子里,正是这 ...

  5. 一个不会翻转二叉树的大神

    2015 年 6 月 10 日,Max Howell 发表了一篇推特: 简单翻译:Google 说,我们 90% 的工程师都使用你写的软件--Homebrew,但是因为你不能在白板上翻转一棵二叉树,所 ...

  6. 菜鸟、普通、大牛、大神

    更多内容关注微信公众号:fullstack888 程序员这个物种自诞生以来,便产生了森严的等级制度,划分标准十分复杂却又有规律可循. 我们暂且分为:菜鸟.普通.大牛.大神四个等级,并用图鉴形式来表现各 ...

  7. Android大神微博集

    Trinea 的博客 来自滴滴出行,Android 开发助手 开发者,android-open-project 维护者 ,android-open-project-analysis 维护者. 中二病也 ...

  8. 斩获BAT-offer大神的两万字面试干货分享

    0.写在最前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自己 ...

  9. 如何给页面加上loding_如何给片头添加字幕?视频剪辑大神们都这样玩

    大家在刷视频时,有没有留意到很多正片前还有一段片头,这是为了使视频内容呈现得更完整.有时候,小伙伴们还会给视频加上一段片尾.与正片相比,片头比较单调,但它的作用很重要.为了使人们更加清楚视频内容的表达 ...

最新文章

  1. 使用Redis搭建电商秒杀系统
  2. P3项目全球模板狗血设置之一 --- 发货到成本中心需要输入Customer
  3. [Ubuntu] 如何在Ubuntu11.04将PHP5.3降级到PHP5.2
  4. 多径传播matlab仿真·信号分析处理
  5. 【渝粤教育】国家开放大学2018年春季 0674-21T财务管理 参考试题
  6. 考研编程练习----排名
  7. 学会使用ant design封装一个锚点组件
  8. node.js入门 - 7.异常处理与多进程开发
  9. 10分钟搭建一个H5商城,支持微信支付和各平台小程序
  10. CS229的简单梳理(待续)
  11. ThinkPHP5 引入 Go AOP
  12. Ubuntu 18.04实现实时显示网速
  13. 这两位学习软件测试的小伙伴,简直太给力了
  14. 算法岗面经总结(快看漫画)
  15. Excel使用公式引用其它sheet数据创建序列,无法忽略空白值的解决办法
  16. 盛世昊通拼车车通证,以共享经济实现行业颠覆
  17. 步进电机每转步数和步进角关系:每转步数 = 360°/歩进角
  18. MySQL--DQL
  19. 通过QQ手机和电脑无线传输文件
  20. Spring Boot集成Hprose

热门文章

  1. xcode项目集成CocoaPods
  2. iOS攻防——(四)class-dump-与-Dumpdecrypted-使用
  3. C/C++程序员上手C#应该知道的100件事(21~30)
  4. CLAMAV 杀毒软件安装及使用配置
  5. mediawiki常用设置
  6. mysql5.6使用profile工具分析sql
  7. Implementing Synchronization Operations
  8. 跟JBPM学设计模式之适配器模式
  9. mysql定时执行存储过程
  10. poj 1195(二维树状数组)