【基础算法】排序-复杂排序之二(找出第K大的数)
切割的思想是高速排序最精髓的地方。每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点
1. 被切割出来的元素K最后一定排在第K位。
2. 在K左边的元素一定比K小或者相等。
3. 在K右边的元素一定比K大或者相等。
所以我们能够通过这些性质定位到随意一个元素。
比方我们partition完一个数组后,得到A={5,3,4,2,6,8,10,12,11,9}
A[K]=8,所以我们知道排好序后的A[5]=8, A[4]一定在8左边,A[6]一定在8右边
所以,我们一定知道8这个数是数组里第5+1小的数。第10-5大的数
所以我们得出 假设切割出来的数A[K]=X, 那么X一定是数组里的第K+1位,也就是第K+1小的数
假设数组的长度为N,那么X就是数组里第N-K大的数
以下是切割的代码
public static int partition(int[] array, int left, int right) {
int i = left;
int j = right + 1;
while (true) {
while (more(array[left], array[++i]))
if (i == right)
break;
while (more(array[--j], array[left]))
if (j == left)
break;
if (i >= j)
break;
exchange(array, i, j);
}
exchange(array, left, j);
return j;
}
接下来就是怎样在切割后定位其它的元素了?
假设我们定位了A[K]=X,发现目标元素O比X大,那么就在右边找,left=K+1,假设比X小,那么就在左边找。right=K-1,否则定位成功
public static int select(int[] array, int k) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int j = partition(array, left, right);
if (j < k)
left = j + 1;
else if (j > k)
right = j - 1;
else
return array[k];
}
return array[k];
}
以下给出完整代码,仅供大家參考
// compare
public static boolean more(int v, int w) {
return v > w;
} // exchange
public static void exchange(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
} public static int partition(int[] array, int left, int right) {
int i = left;
int j = right + 1; while (true) { while (more(array[left], array[++i]))
if (i == right)
break;
while (more(array[--j], array[left]))
if (j == left)
break; if (i >= j)
break;
exchange(array, i, j);
}
exchange(array, left, j);
return j;
} public static int select(int[] array, int k) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int j = partition(array, left, right);
if (j < k)
left = j + 1;
else if (j > k)
right = j - 1;
else
return array[k];
}
return array[k];
}
【基础算法】排序-复杂排序之二(找出第K大的数)的更多相关文章
- OpenJudge计算概论-找出第k大的数
/*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...
- 从数组中找出第K大的数
利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...
- 刷题-力扣-1738. 找出第 K 大的异或坐标值
1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...
- 719. 找出第 K 小的数对距离
719. 找出第 K 小的数对距离 这道题其实有那么一点二分猜答案的意思,也有很多类似题目,只不过这道题确实表达的不是很清晰不容易想到,题没问题,我的问题.既然是猜答案,那么二分边界自然就是距离最大值 ...
- 1738. 找出第 K 大的异或坐标值
2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...
- 算法题之找出数组里第K大的数
问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...
- 海量数据中找出前k大数(topk问题)
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- 从长度为 M 的无序数组中,找出N个最小的数
从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...
随机推荐
- 用session设置访问权限
在web.xml中 <session-config> <session-timeout>15</session-timeout> </session-conf ...
- docke存储
1.Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs.volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker ...
- 四则运算出题系统,java
程序设计思想: 首先通过判断选择计算的范围,然后用随机数生成两个随机数,定义另一个数,将两个随机数计算得到的值赋给定义的数 程序代码: package Kaos1; import java.util. ...
- 粟粟的书架(bzoj 1926)
Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架, ...
- Codevs 1643 & 3027 线段覆盖
1643 题意 给定若干条线段,问最多可以安排多少条使得没有重合. 思路 贪心,同安排schedule,按结束时间早的排序. Code #include <bits/stdc++.h> # ...
- 最简单方法远程调试Python多进程子程序
Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/ ...
- 【C/C++】快速排序的两种实现思路
方法一:不断填坑,一次确定一个值.http://blog.csdn.net/morewindows/article/details/6684558 #include<stdio.h> vo ...
- hdu 2363(枚举+最短路好题)
Cycling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- layui如何使用内部jQuery?
遇到问题情境: 由于Layui部分内置模块依赖jQuery,所以没有单独引入jQuery,但是在使用$常规写法获取dom元素时,提示未定义 出现问题的原因: 由于Layui部分内置模块依赖jQuery ...
- HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))
Rabbits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...