
快速选择算法
选择一个枯板值(pivot):通常选择数组的左侧或右侧元素,常常是数组的第一个或最后一个元素。 分区处理:将数组划分为三部分。 递归处理:根据枯板值的位置和要查找的第k大元素位置,决定是否进入左侧或右侧子数组,调整k值并继续递归。 初始化:在函数 移动指针: 交换元素:当i和j指针位置确定后,交换左右两个指针之间的元素,i和j向中间移动。 递归判断: 终止条件:当左右指针交叉时,第k大元素位于枯板值右侧的下一个位置,直接返回该值。 初始调用:调用 选择枯板值:pivot=9。 调整i和j:i从左边移动到比9大的值,在本例中,i被移动到位置4(元素8)。j从右边移动到位置2(元素4),因为4 < 9。 交换元素:交换9和4,此时i=4,j=2。 递归处理:由于k=3,检查是否在枯板值右侧新的范围内。 继续递归:进入右侧范围,调整k,并调用递归,找到正确的第3大元素。
发布日期:2021-05-18 05:07:48
浏览次数:19
分类:精选文章
本文共 2017 字,大约阅读时间需要 6 分钟。
快速选择算法实现:第k大元素查找
快速选择算法是一种优化的选择算法,可以在O(n)的时间复杂度内找到一个数组中的第k大元素。它与快速排序的主要区别在于,快速排序需要对整个数组进行排序,而快速选择只关注找到特定的位置。这种方法在处理需要频繁查询第k大元素的问题时非常有用,例如在解决排序问题或数据挖掘中。
斑马鱼珠算法要点
- 左侧:所有小于枯板值的元素。
- 中枢元素:枯板值。
- 右侧:所有大于枯板值的元素。
详细步骤
quickSelect
中,选择枯板值为数组的第一个元素,然后设定左右指针。- 从左向右移动指针i,寻找小于枯板值的元素。
- 从右向左移动指针j,寻找大于枯板值的元素。
- 如果第k大元素在枯板值的左侧区域,调用递归处理该区域。
- 否则,递归处理右侧区域,并调整k值,减去左侧元素的数量。
优化与注意事项
- 处理重复值:在排列中可能有重复元素,这种情况下,枯板值可能导致多次交换,需要确保枯板值是唯一的或有特定规则来避免死循环。
- k值范围:确保k值在合理范围内,避免越界。
- 数组长度检查:初始检查数组长度和k值是否合理,以避免无效操作。
实现代码
class Solution { public int kthLargestElement(int k, int[] nums) { return quickSelect(nums, 0, nums.length - 1, k); } private int quickSelect(int[] nums, int left, int right, int k) { if (left >= right) { return nums[left]; } int pivot = nums[left]; int i = left; int j = right; // Partition数组为左右两边分割枯板值 // i从左往右寻找大于pivot的 while (i <= j && nums[i] > pivot) { i++; } // j从右往左寻找小于pivot的 while (i <= j && nums[j] < pivot) { j--; } // 交换左右两边的元素 if (i > j) { return pivot; } int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; i++; j--; // 分情况处理k的位置 if (k > nums.length - j - 1) { return quickSelect(nums, i, right, k); } else if (k <= nums.length - i) { return quickSelect(nums, i, right, k - (i - left)); } else { return nums[j + 1]; } }}
示例分析
假设有一个数组 [9, 3, 2, 4, 8]
,目标找到第3大元素。
quickSelect
,left=0,right=4,k=3。这种方法通过每次选择枯板值并递归处理,有效地缩小了问题规模,保证了算法的高效性。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月17日 04时38分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MacOS 应对系统无响应的方法
2019-03-14
使用KeyShot调整一个场景中的照明亮度
2019-03-14
Mac隐藏辅助功能|自定义苹果Mac显示器
2019-03-14
ActivityNotFoundException异常错误
2019-03-14
git远程仓库切换
2019-03-14
带照片捕捉功能的ESP32-CAM PIR运动检测器
2019-03-15
如何使用SSH远程管理Linux服务器
2019-03-15
降级到旧版本macOS的3种方法
2019-03-15
学习Vue.js2.0(国外视频教程)
2019-03-15
wxPython和PyOpenGL视频
2019-03-15
在30分钟内学习PHP
2019-03-15
Python http.server 服务器
2019-03-15
Python svm 支持向量机
2019-03-15
OpenStack 最小化安装配置(一):物理机网桥配置
2019-03-15
PS快速美白照片
2019-03-15
ubuntu 16.04 镜像下载
2019-03-15
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
2019-03-15
微信小程序云开发:怎么删除云函数?已解决
2019-03-15