算法 系列博客

【算法】刷题范围建议 和 代码规范
【算法】复杂度理论 ( 时间复杂度 )

【字符串】最长回文子串 ( 蛮力算法 )
【字符串】最长回文子串 ( 中心线枚举算法 )
【字符串】最长回文子串 ( 动态规划算法 ) ★
【字符串】字符串查找 ( 蛮力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )

【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
【算法】双指针算法 ( 有效回文串 II )
【算法】哈希表 ( 两数之和 )

【算法】快速排序
【算法】归并排序
【算法】快速排序与归并排序对比
【算法】快速选择算法 ( 数组中找第 K 大元素 )


文章目录

  • 算法 系列博客
  • 一、快速选择算法

一、快速选择算法


数组中找第 K 大元素 : https://www.lintcode.com/problem/5/

可以 先进行 快速排序 , 然后找第 k 大的元素 ;

先排序 , 在获取值 , 会消耗 排序的时间复杂度 O(nlog⁡n)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 大元素 )相关推荐

  1. 【LeetCode】快排-无序整数数组中找第k大的数(或者最小的k个数)

    一个有代表性的题目:无序整数数组中找第k大的数,对快排进行优化. 这里先不说这个题目怎么解答,先仔细回顾回顾快排,掰开了揉碎了理解理解这个排序算法:时间复杂度.空间复杂度:什么情况下是复杂度最高的情况 ...

  2. 无序数组中找第K大的数

    类快排算法 leetcode215 由于只要求找出第k大的数,没必要将数组中所有值都排序. 典型解法:快速排序分组. 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另 ...

  3. 数组中的第K大元素问题(C++)

    数组中的第K大元素问题 问题: 在未排序的数组中找到第 k 个最大的元素.请注意,需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 约定: 假设这里数组的长度为 n. 方法一: ...

  4. 如何寻找无序数组中的第K大元素?

    如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...

  5. 两个排序数组中找第k大的数

    一.题目描述 给定两个已经排序好的数组,找到两者所有元素中第k大的元素 二.解法分析 解法一:参照归并排序 将两个有序数组变成一个有序数组:merge两个数组,然后求第k大的数,时间复杂度O(m+n) ...

  6. DC-leetcode215数组中的第k大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  7. 趣解面试高频算法难题:数组中的第K个最大元素

    第二天,在另一家公司-- 小灰是吧?请简单介绍一下你自己. 好的,blah blah blah-- 下面考你一道算法题: 给你一个无序数组,要求你找出数组中的第k大元素. 题目是什么意思呢?比如给定的 ...

  8. 网易_在数组中查找前K个元素

    笔试题,最后一题 查找网易云音乐中播放量最大的前K个歌曲. 换句话说,就是在数组中查找前K大元素. 大致有以下几个思路. 1.第一感觉就是对数组进行降序全排序,然后返回前K个元素,即是需要的K个最大数 ...

  9. 第k大的数python代码_Python实现查找数组中任意第k大的数字算法示例

    本文实例讲述了Python实现查找数组中任意第k大的数字算法.分享给大家供大家参考,具体如下: 模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候, ...

最新文章

  1. C语言----求解N以内的素数的两种典型方法以及其优化
  2. python装饰器-Python @函数装饰器及用法(超级详细)
  3. springmvc整合redis架构搭建实例
  4. ACM入门之【KMP】
  5. 2022还在使用Mysql进行数据检索?ElasticSearch自定义扩展词库完成检索
  6. Black Hat 2017黑帽大会:8款值得一看的黑客工具
  7. Linux下redmine安装插件报错
  8. CentOS查看硬件信息
  9. ecshop 源码分析
  10. 汉王考勤系统服务器IP,汉王人脸识别考勤客户端使用说明
  11. linux vim创建文件配置文件,vim linux 强大的配置文件
  12. 直流开环调速系统 simulink仿真
  13. Linux入门三:安装CentOS 7(桌面版);
  14. 最短路径(图论-北京地铁线路查询)
  15. 考研政治|马克思主义基本原理
  16. mysql分析问卷_问卷调查相关表
  17. hive client 登录报权限不足问题/tmp/hive on HDFS should be writable. Current permissions are: rwx------
  18. 视频|《8问》浙江大学张宏鑫:边缘计算或许是区块链的福音
  19. html 解析接口返回数据,请求第三方接口返回json格式数据的解析
  20. word试题模板设计总结

热门文章

  1. Discuz!NT论坛代码小分析
  2. 石川es6课程---4、箭头函数
  3. 2018-2019-1 20165223 20165218 实验二 固件程序设计
  4. Flask-Migrate拓展数据库表结构
  5. 基于alipay用到的
  6. Xcode中的Info.plist字段列表详解
  7. 09_Mybatis开发Dao方法——mapper代理开发规范
  8. 文档型数据库设计模式-如何存储树形数据
  9. SQL Server 迁移数据到MySQL
  10. javascript严格模式