在数组中找到第K小的值,我们利用划分函数,可以做到和快排异曲同工的效果。
话不多说,先上在快排中的划分函数代码:

int Parition(vector<int>& ar, int left, int right)
{assert(!ar.empty());int tmp = ar[left];while (left < right){while (left < right && ar[right] > tmp) --right;ar[left] = ar[right];while (left < right && ar[left] <= tmp) ++left;ar[right] = ar[left];}ar[left] = tmp;return left;
}

我们知道,每一次划分后,划分标准值就将数组划分为两个部分,前部分全都小于等于标准值,后半部分全都大于标准值。划分后,划分标准值与最左边值的距离x,即表示这个划分标准值是这段数据里的第x小的数,此时我们只需要将K值与每一次划分标准值的下标比较大小,即可确定第K小的值在划分后的前部分还是后部分。
在这里比较困难的是,每次划分后,都要更新K值,和需要找寻第K小的值的数据范围。这样说有些迷糊,让我们从数据中感受。

比如我们找第7小的值,即K = 7。上面俩数据,第一组是原始数据,第二组是经过第一次划分后的。此时45 ~ 56有5个数据,K = 7 > 5,所以我们后面应该在90 ~ 100范围内找,但是这时候我们应该注意,在90~100里我们找第K-5小即第2小的值,才能对应原始数据中第K即第7小的值 ,所以每次划分后,我们都需要确定下一次找寻范围,并更新K值。
利用划分函数找第K小的值的剩下递归代码:

int Select_Kmin(vector<int>& br, int left, int right, int k)
{if (left == right && k == 1) return br[left];if (left == right && k != 1) exit(-1);//如果一开始K值小于0或者K大于数据数量,则不存在这样的第K小的值,就会执行这个语句int index = Parition(br, left, right);//划分后,划分标准值的下标int pos = (index - left + 1);//划分后,划分标准值在这部分数据里对应的是第pos小if (k <= pos)return Select_Kmin(br, left, index, k);elsereturn Select_Kmin(br, index + 1, right, k - pos);
}

找到数组中第k小的值(利用快排的划分函数)相关推荐

  1. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  2. 算法导论:快速找出无序数组中第k小的数

    题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1). ...

  3. 九度OJ 题目1534:数组中第K小的数字(二分解)

    题目链接:点击打开链接 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6 ...

  4. 利用堆排序查找数组中第K小的元素方法

    先从数组A[ ]中取前k个元素建立大根堆,然后再遍历剩下的n-k个元素, 如果大于或者等于堆顶,则舍弃: 如果小于堆顶,则将其与堆顶替换,并将换下来的堆顶舍弃,然后重新向下调整为大根堆,最后堆顶即为所 ...

  5. java 寻找数组中第k大的值

    转载请注明来自:黄朝辉的博客 0.前言 在未排序的数组中查找第k大的数.这里不对k的值进行判断了,认为它是合法的. 1.排序 public static int findKthLargest(int[ ...

  6. [leetcode]求数组的第k个最大值,python快排解法

    python版快排 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:self.quicksort( ...

  7. 二分、数组-LeetCode378. 有序矩阵中第K小的元素

    1.题目描述 https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/ 给定一个 n x n 矩阵,其中每行和 ...

  8. 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Title 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ ...

  9. python n个list如何组成矩阵_有序矩阵中第K小的元素amp;x的平方根(二分法篇)

    69. x的平方根 题目描述: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例1: ...

最新文章

  1. php面向对象链接mysql_php连接数据库的两种方式- 面向过程 面向对象
  2. ASP.NET MVC Controller激活系统详解:默认实现
  3. 【Python】调用百度云API驾驶行为分析 Driver Behavior
  4. 词汇量贫乏只会说yes、no?试试这些高级感替代词!
  5. oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園
  6. 脚本修改IIS连接数
  7. 云栖科技评论第57期:技术拓展科学边界 科学激发技术创新
  8. (6)css常用样式属性--文字样式
  9. 3、Fiddler 如何捕获Firefox的会话
  10. 简述开发Android2D图形,2D图形开发(一)(高级).pdf
  11. Qt 5.9.0安装教程
  12. 宋体小二对应html中css,CSS字体中英文姓名对照表:如宋体对应SimSun
  13. 统计知识 | 中心极限定理及偏差
  14. Intel HD Graphics620显卡不支持Windows7的驱动的间接安装显卡驱动
  15. 6.0系统机器Xposed框架安装经验
  16. linux中的nm命令简介【转】
  17. 周报 | 吉吉拍助力消费者转变
  18. 猿编程python代码_程序猿编程课堂 Python学习之入门篇3:简单的数据类型
  19. python实现SVG文件解析
  20. Pandas常用累计、同比、环比等统计方法实践案例

热门文章

  1. [Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)
  2. iOS GPUImage之滤镜功能说明
  3. torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor
  4. 迈克尔逊干涉仪的调整与使用实验报告
  5. 数据库开发——MySQL——简单介绍和安装
  6. 2016年第七届蓝桥杯 - 国赛 - Java大学C组 - I. 路径之谜
  7. 1026:空格分隔输出
  8. Netty实战 IM即时通讯系统(五)客户端启动流程
  9. 【Qt】QWidget类详解(函数篇)
  10. mysql工_mysql