文章目录

  • 什么是快速选择算法?
  • 代码演示

什么是快速选择算法?

快速排序的一种变形就是快速选择算法, 通常用来在未排序的数组中寻找第k小/第k大的元素

快速选择的总体思路与快速排序相似,选择一个元素作为基准来对元素进行分区,将小于和大于基准的元素分在基准左边和右边的两个区域。不同的是,快速选择并不递归访问双边,而是只递归进入一边的元素中继续寻找。这降低了平均时间复杂度,从O(nlog n)至O(n),不过最坏情况仍然是 O ( n 2 ) O(n^2) O(n2)。

代码演示

求数组中的第K个最大元素

import java.util.Random;public class QuickSelect {int [] nums;public void swap(int a, int b) {int tmp = this.nums[a];this.nums[a] = this.nums[b];this.nums[b] = tmp;}public int partition(int left, int right, int pivot_index) {int pivot = this.nums[pivot_index];// 1. move pivot to endswap(pivot_index, right);//不让pivot比较它自己,先移走,回头再移回来int store_index = left;// 2. move all smaller elements to the leftfor (int i = left; i <= right; i++) {//遍历left - rightif (this.nums[i] < pivot) {swap(store_index, i);store_index++;//每出现一个比pivot小的,就交换,store_index+1,最后的结果nums[store_index]左边都比pivot小}}// 3. move pivot to its final placeswap(store_index, right);return store_index;}/*** 快速选择算法* @param left 数组左侧* @param right 数组右侧* @param k_smallest k* @return 第k小的元素*/public int quickselect(int left, int right, int k_smallest) {/*Returns the k-th smallest element of list within left..right.*/if (left == right) // If the list contains only one element,return this.nums[left];  // return that element// select a random pivot_indexRandom random_num = new Random();int pivot_index = left + random_num.nextInt(right - left);pivot_index = partition(left, right, pivot_index);// the pivot is on (N - k)th smallest positionif (k_smallest == pivot_index)return this.nums[k_smallest];// go left sideelse if (k_smallest < pivot_index)return quickselect(left, pivot_index - 1, k_smallest);// go right sidereturn quickselect(pivot_index + 1, right, k_smallest);}/*** 选择第k大的元素* @param nums* @param k* @return 第k大的元素*/public int findKthLargest(int[] nums, int k) {this.nums = nums;int size = nums.length;// kth largest is (N - k)th smallestreturn quickselect(0, size - 1, size - k);}public static void main(String[] args) {QuickSelect quickSelect = new QuickSelect();int[] nums = {3,2,3,1,2,4,5,5,6};int kthLargest = quickSelect.findKthLargest(nums, 4);System.out.println(kthLargest);}
}

复杂度分析

  • 时间复杂度 : 平均情况 O ( N ) O(N) O(N),最坏情况 O ( N 2 ) O(N^2) O(N2)。
    空间复杂度 : O ( 1 ) O(1) O(1)。

快速选择算法(Quick Select Algorithm)相关推荐

  1. 快速选择算法Quick Select Algorithm(Java和C++代码实现)

    what is Quick select? 快速选择是一种从无序列表找到第k小元素的选择算法.它从原理上来说与快速排序有关.同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间 ...

  2. 快排亲兄弟:快速选择算法详解

    后台回复进群一起刷力扣???? 点击下方卡片可搜索文章???? 读完本文,可以去力扣解决如下题目: 215.数组中的第 K 个最大元素(Medium) 快速选择算法是一个非常经典的算法,和快速排序算法 ...

  3. quickselect_QuickSelect:使用代码示例解释的快速选择算法

    quickselect 什么是QuickSelect? (What is QuickSelect?) QuickSelect is a selection algorithm to find the ...

  4. Quick select

    https://zhuanlan.zhihu.com/p/64627590 Quick select算法通常用来在未排序的数组中寻找第k小/第k大的元素 总体而言,Quick select采用和Qui ...

  5. 飘逸的python - 大数据TopK问题的quick select解法

    TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词. 方法一: 先排序,然后截取前k个数. 时间复杂度:O(n*logn)+O(k)=O(n*logn) ...

  6. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)

    8.5 分水岭算法(watershed algorithm) 1.基于拓扑理论的数学形态学的分割方法. 2.基本思想:把图像看作测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局 ...

  7. 感知哈希算法(perceptual hash algorithm),

    感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个"指纹"(fingerprint)字符串,然后比较不同图像的指纹.结果越接近,就说明 ...

  8. 【算法】快速选择算法 ( 数组中找第 K 大元素 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  9. 谷歌的网页排序算法(PageRank Algorithm)

    本文将介绍谷歌的网页排序算法(PageRank Algorithm),以及它如何从250亿份网页中捞到与你的搜索条件匹配的结果.它的匹配效果如此之好,以至于"谷歌"(google) ...

最新文章

  1. XamarinEssentials教程首选项Preferences判断项目是否存在
  2. 如何在linux下安装mysql5.7?
  3. Jetty9.2.2集群Session共享
  4. PHP中is_numeric函数十六进制绕过0day
  5. java mvc 获取session_Spring MVC----获取session/request
  6. 大屏网页手机缩放html,大屏页面三种缩放
  7. matlab 如何hidden,Matlab基本函数-hidden函数
  8. 新AlphaGo这么强!36小时从0自学成大师,100:0把李世乭版秒成渣渣 | Nature论文
  9. 保研复习整理——通信原理
  10. java求职英文简历范本2篇_JAVA英文求职简历范文
  11. Touch Panel调试
  12. 深度学习笔记----拓扑结构动态变化网络(Dropout,Drop Connect, Stochastic Depth, BranchyNet,Blockdrop,SkipNet)
  13. 软工网络15团队作业3——需求分析与设计
  14. Codeforces1221 C. Perfect Team
  15. docker 启动失败:specified both as a flag and in the configuration fir/daemon.json
  16. java实现天气预报
  17. 学习笔记:简谈推挽电路
  18. 计算机基础知识 pdf答案,计算机基础知识试题及答案(一).pdf
  19. Html-小米官网头部
  20. MATLAB(七)影像处理(1)

热门文章

  1. android动画入门,Android动画基础总结
  2. Android 性能优化 - 彻底解决内存泄漏
  3. 爬虫-requests,微信公众号推送
  4. 八月25日8点半服务器维修,8月26日服务器例行维护公告(已完成)
  5. EOS 连接本地网络amp;amp;测试网络amp;amp;主网
  6. 数据分析的目的是什么,真的是为了分析吗?
  7. MySQL 上亿大表如何优化?
  8. Oracle数据库汉字占几个字节
  9. CSS(Cascading Style Sheet)总结
  10. AI征战奥林匹克,科技奥运未来可期