【算法】快速选择算法 ( 数组中找第 K 大元素 )
算法 系列博客
【算法】刷题范围建议 和 代码规范
【算法】复杂度理论 ( 时间复杂度 )
【字符串】最长回文子串 ( 蛮力算法 )
【字符串】最长回文子串 ( 中心线枚举算法 )
【字符串】最长回文子串 ( 动态规划算法 ) ★
【字符串】字符串查找 ( 蛮力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )
【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
【算法】双指针算法 ( 有效回文串 II )
【算法】哈希表 ( 两数之和 )
【算法】快速排序
【算法】归并排序
【算法】快速排序与归并排序对比
【算法】快速选择算法 ( 数组中找第 K 大元素 )
文章目录
- 算法 系列博客
- 一、快速选择算法
一、快速选择算法
数组中找第 K 大元素 : https://www.lintcode.com/problem/5/
可以 先进行 快速排序 , 然后找第 k 大的元素 ;
先排序 , 在获取值 , 会消耗 排序的时间复杂度 O(nlogn)O(n \log n)O(nlogn) ;
使用 快速选择算法 , 可以达到 O(n)O(n)O(n) 的时间复杂度 ;
快速选择算法 利用了快速排序算法的步骤 , 快速排序的第一个步骤是从数组中 挑选一个元素 p , 依据 p 将数组分为两部分 , 左侧是小于等于 p 的部分 , 右侧是大于等于 p 的部分 ;
上述步骤的时间复杂度是 O(n)O(n)O(n) ;
分割后 , 左边有 m 个数 , 右边有 n 个数 ;
- 假如 k <= m , 则说明要取的值在左侧 , 右侧就不用进行排序了 ;
- 假如 k > m , 则说明要取的值在右侧 , 左侧就不用排序了 ;
这样 , 要处理的数据规模就缩小了一半 ;
时间复杂度分析 : 通过 O(n)O(n)O(n) 的时间复杂度 , 进行了第一次分割 , 将数组分为左右两部分 ;
T(n)=O(n)+T(n2)T(n) = O(n) + T(\cfrac{n}{2})T(n)=O(n)+T(2n)
=O(n)+T(n2)\ \ \ \ \ \ \ \ \ = O(n) + T(\cfrac{n}{2}) =O(n)+T(2n)
=O(n)+O(n2)+T(n4)\ \ \ \ \ \ \ \ \ = O(n) + O(\cfrac{n}{2}) + T(\cfrac{n}{4}) =O(n)+O(2n)+T(4n)
时间复杂度计算时 , 只考虑最高次项 , 忽略常数 , 忽略系数 ,
最终的时间复杂度是 O(n)O(n)O(n) ;
因此使用快速选择算法 , 找数组中的第 K 大元素 , 时间复杂度是 O(n)O(n)O(n) ;
代码示例 :
class Solution {/*** 快速选择算法* 第 K 大元素* @param k* @param array* @return*/public int kthLargestElement(int k, int[] array) {if (array == null){return -1;}return quickSelect(array, 0, array.length - 1, k);}// 在 array 数组中, 从 start 到 end 中找到第 k 大元素private int quickSelect(int[] array, int start, int end, int k) {if (start == end) {// 说明此时找到了第 K 大元素return array[start];}// 左右两个指针及中间元素值int left = start, right = end, pivot = array[(start + end) / 2];while (left <= right) {while (left <= right && array[left] > pivot) {// 默认自增, 如果遇到一个元素大于中心值, 则退出循环, 记录该元素索引 leftleft++;}while (left <= right && array[right] < pivot) {// 默认自增, 如果遇到一个元素小于中心值, 则退出循环, 记录该元素索引 rightright--;}// 交换两个元素if (left <= right) {int tmp = array[left];array[left] = array[right];array[right] = tmp;// 交换完毕后, 左指针自增, 右指针自减, 继续向后执行left++;right--;}}// 分割完成, 此时索引的排列 start right left end , 其中 right 和 left 之间可能还有元素// 这里涉及到了 3 部分 , start 到 right 之间, right 到 left 之间, left 到 end 之间// right 到 left 之间只可能有 1 个数// 判定 k 在哪个部分if (start + k - 1 <= right) {// 左侧部分 : 第 k 个数在 start 到 right 之间return quickSelect(array, start, right, k);}if (start + k - 1 >= left) {// 右侧部分 : 第 k 个数在 left 到 end 之间// 左侧有 left - start 个数, 总共 k 个数, 在右边只需要找第 k - (left - start) 个数return quickSelect(array, left, end, k - (left - start));}// 如果上述两种情况都不是, 则是中间部分, right 到 left 之间的一个数, 可以写成 right + 1 或 left - 1return array[right + 1];}
}
【算法】快速选择算法 ( 数组中找第 K 大元素 )相关推荐
- 【LeetCode】快排-无序整数数组中找第k大的数(或者最小的k个数)
一个有代表性的题目:无序整数数组中找第k大的数,对快排进行优化. 这里先不说这个题目怎么解答,先仔细回顾回顾快排,掰开了揉碎了理解理解这个排序算法:时间复杂度.空间复杂度:什么情况下是复杂度最高的情况 ...
- 无序数组中找第K大的数
类快排算法 leetcode215 由于只要求找出第k大的数,没必要将数组中所有值都排序. 典型解法:快速排序分组. 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另 ...
- 数组中的第K大元素问题(C++)
数组中的第K大元素问题 问题: 在未排序的数组中找到第 k 个最大的元素.请注意,需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 约定: 假设这里数组的长度为 n. 方法一: ...
- 如何寻找无序数组中的第K大元素?
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...
- 两个排序数组中找第k大的数
一.题目描述 给定两个已经排序好的数组,找到两者所有元素中第k大的元素 二.解法分析 解法一:参照归并排序 将两个有序数组变成一个有序数组:merge两个数组,然后求第k大的数,时间复杂度O(m+n) ...
- DC-leetcode215数组中的第k大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- 趣解面试高频算法难题:数组中的第K个最大元素
第二天,在另一家公司-- 小灰是吧?请简单介绍一下你自己. 好的,blah blah blah-- 下面考你一道算法题: 给你一个无序数组,要求你找出数组中的第k大元素. 题目是什么意思呢?比如给定的 ...
- 网易_在数组中查找前K个元素
笔试题,最后一题 查找网易云音乐中播放量最大的前K个歌曲. 换句话说,就是在数组中查找前K大元素. 大致有以下几个思路. 1.第一感觉就是对数组进行降序全排序,然后返回前K个元素,即是需要的K个最大数 ...
- 第k大的数python代码_Python实现查找数组中任意第k大的数字算法示例
本文实例讲述了Python实现查找数组中任意第k大的数字算法.分享给大家供大家参考,具体如下: 模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候, ...
最新文章
- C语言----求解N以内的素数的两种典型方法以及其优化
- python装饰器-Python @函数装饰器及用法(超级详细)
- springmvc整合redis架构搭建实例
- ACM入门之【KMP】
- 2022还在使用Mysql进行数据检索?ElasticSearch自定义扩展词库完成检索
- Black Hat 2017黑帽大会:8款值得一看的黑客工具
- Linux下redmine安装插件报错
- CentOS查看硬件信息
- ecshop 源码分析
- 汉王考勤系统服务器IP,汉王人脸识别考勤客户端使用说明
- linux vim创建文件配置文件,vim linux 强大的配置文件
- 直流开环调速系统 simulink仿真
- Linux入门三:安装CentOS 7(桌面版);
- 最短路径(图论-北京地铁线路查询)
- 考研政治|马克思主义基本原理
- mysql分析问卷_问卷调查相关表
- hive client 登录报权限不足问题/tmp/hive on HDFS should be writable. Current permissions are: rwx------
- 视频|《8问》浙江大学张宏鑫:边缘计算或许是区块链的福音
- html 解析接口返回数据,请求第三方接口返回json格式数据的解析
- word试题模板设计总结