切割的思想是高速排序最精髓的地方。每一次切割出来的元素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大的数)的更多相关文章

  1. OpenJudge计算概论-找出第k大的数

    /*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...

  2. 从数组中找出第K大的数

    利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...

  3. 刷题-力扣-1738. 找出第 K 大的异或坐标值

    1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...

  4. 719. 找出第 K 小的数对距离

    719. 找出第 K 小的数对距离 这道题其实有那么一点二分猜答案的意思,也有很多类似题目,只不过这道题确实表达的不是很清晰不容易想到,题没问题,我的问题.既然是猜答案,那么二分边界自然就是距离最大值 ...

  5. 1738. 找出第 K 大的异或坐标值

    2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...

  6. 算法题之找出数组里第K大的数

    问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...

  7. 海量数据中找出前k大数(topk问题)

    海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...

  8. 找出整数中第k大的数

    一  问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二  举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...

  9. 从长度为 M 的无序数组中,找出N个最小的数

    从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...

随机推荐

  1. 用session设置访问权限

    在web.xml中 <session-config> <session-timeout>15</session-timeout> </session-conf ...

  2. docke存储

    1.Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs.volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker ...

  3. 四则运算出题系统,java

    程序设计思想: 首先通过判断选择计算的范围,然后用随机数生成两个随机数,定义另一个数,将两个随机数计算得到的值赋给定义的数 程序代码: package Kaos1; import java.util. ...

  4. 粟粟的书架(bzoj 1926)

    Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架, ...

  5. Codevs 1643 & 3027 线段覆盖

    1643 题意 给定若干条线段,问最多可以安排多少条使得没有重合. 思路 贪心,同安排schedule,按结束时间早的排序. Code #include <bits/stdc++.h> # ...

  6. 最简单方法远程调试Python多进程子程序

    Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/ ...

  7. 【C/C++】快速排序的两种实现思路

    方法一:不断填坑,一次确定一个值.http://blog.csdn.net/morewindows/article/details/6684558 #include<stdio.h> vo ...

  8. hdu 2363(枚举+最短路好题)

    Cycling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. layui如何使用内部jQuery?

    遇到问题情境: 由于Layui部分内置模块依赖jQuery,所以没有单独引入jQuery,但是在使用$常规写法获取dom元素时,提示未定义 出现问题的原因: 由于Layui部分内置模块依赖jQuery ...

  10. HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    Rabbits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...