2018.4.24 快排查找第K大
import java.util.Arrays; /*
核心思想:利用快排思想,先假定从大到小排序,找枢纽,枢纽会把大小分开它的两边,当枢纽下标等于k时,
即分了k位在它左边或右边,也就是最大或最小的排到了它的左边或右边了。那么那个枢纽就是要找的第k位了
*/
public class SearchNumData {
/*
n为数组长度
k为要查找的第k大
*/
public static int findKth(int[] a, int n, int K) {
return findKth(a, 0, n - 1, K);
} /*
start为数组最低位下标
end为数组最高位下标
*/
public static int findKth(int[] a, int start, int end, int k) {
//先进行一次快排,取得枢纽
int pivot = partation(a, start, end);
//pivot-start+1表示快排的前半段元素的个数(包括中轴)
//每次划分后,大的在左边,小的在右边
if (k == pivot - start + 1){
return a[pivot];
} else if (k > pivot - start + 1) {
//说明第k大的元素在后半段,所以往后面查,start=pivot+1,k-(pivot-start+1)。往后查的还是整个数组的第k大,每次次快排枢纽的时候,已经把大的放右边了。
return findKth(a, pivot + 1, end, k - pivot + start - 1);
} else{
//则第k大的元素在前半段,更新end=pivot-1
return findKth(a, start, pivot - 1, k);
}
}
//快排,找枢纽,从大到小排序
public static int partation(int[] a, int low, int high) {
int key = a[low];
while (low < high) {
while (low < high && a[high] <= key)
high--;
a[low] = a[high];
while (low < high && a[low] >= key)
low++;
a[high] = a[low];
}
a[low] = key;
return low;
} public static void quicksort(int[] a, int low, int high) {
if(low < high) {
int pivot = partation(a, low, high);
quicksort(a, low, pivot-1);
quicksort(a, pivot+1, high);
}
} public static void main(String[] args) {
int[] array = {
9, 1, 5, 3, 5, 2, 6, 8, 7, 6, 9, 8
};
System.out.println("----------原数组-----------");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
int [] array2 = array.clone();
int k = 4;
int num=findKth(array,array.length,k);
System.out.println("----------第"+k+"大-----------");
System.out.println(num);
System.out.println("----------处理后-----------");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
System.out.println("----------原数组排序后-------");
// Arrays.sort(array);
quicksort(array,0,array.length-1);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
System.out.println("------------------------");
for(int i=0;i<array2.length;i++){
if (num==array2[i]){
System.out.println("原数组位置-----"+i);
}
}
}
}
输出:
----------原数组-----------
9 1 5 3 5 2 6 8 7 6 9 8
----------第4大-----------
8
----------处理后-----------
9 9 8 8 7 6 6 5 5 3 2 1
----------原数组排序后-------
9 9 8 8 7 6 6 5 5 3 2 1
------------------------
原数组位置-----7
原数组位置-----11
2018.4.24 快排查找第K大的更多相关文章
- 快排查找第K小的数
#include "iostream.h" using namespace std; int findMedian(int *A,int left,int right){ int ...
- 快排找第k大模板
int get_kth(int l,int r) { if (l==r) return a[r]; ]; while (i<j) { while (a[i]<mid) i++; while ...
- 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》
前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...
- 基于快速排序思想partition查找第K大的数或者第K小的数。
快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...
- 牛客网-3 网易编程题(1拓扑&2二叉树的公共最近祖先&3快排找第K大数)
1. 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更 ...
- 查找第K大的数
类快排 第一种方法 o(n) #include <bits/stdc++.h> using namespace std; const int N = 1000; int s[N]; int ...
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
- 查找第K大的值
这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ ...
- 820复试算法 快排找第 k 小
done {20-01-30 12:56} ref: https://blog.csdn.net/fengsigaoju/article/details/50728588 note: void qui ...
随机推荐
- Ubuntu 安装 Docker CE
注:本文转载自<Docker入门> 警告:切勿在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker. 准备工作 系统要求 Docker CE 支持以下版本的 ...
- Git的初次使用
一.配置本地Git库 1.下载安装好Git,并配置自己的信息. git config --global user.name"yourname"配置你的名称 git config - ...
- 自制URL转换器
自定义 url 转换器五个步骤: 定义一个类. 在类中定义一个属性 regex ,这个属性是用来保存 url 转换器规则的正则表达式. 实现 to_python(self,value) 方法, ...
- 当后台获取内容有标签时如何过滤---angular
$sce controller中注入$sce服务; 假设将获取到的标签内容为result; $scope.result = $sce.trustAsHtml(result); 在html页面中则< ...
- 查找IDEA 项目中的依赖包存放在.m2位置
原因:在maven项目pom.xml中添加依赖,可能由于网络不好,下载不完全,导致再次下载一直报错. 就会导致出现依赖一直报错.
- selenium+Java使用内容记录(全)
1.模拟键盘操作,使用enter键 2.等待几秒 3.浏览器最大化 4.获取cookie,删除cookie 5.模拟鼠标 6.selenium+java 识别验证码(数字+字母组合) 7.seleni ...
- EF Core
一个事务中 先在数据库查出一条数据进行修改 然后在进行查询 他会直接在内存中找到这条数据 不会再数据库查询了 EF Core的 linq语句中可以使用C#方法或函数 在EF6或 ...
- [easyUI] datagrid 数据格 可以进行分页
1. 新建一个GridNode的类: public class GridNode { private Long id; private String title;//投票标题 private Inte ...
- VSCode汉化
1.打开VSCode 点击箭头指示地方 在搜索框中输入chinese 然后安装中文简体 2.按住 Ctrl+shift+p 选择配置显示语言 然后会看见下面的样子 添加 "locale&q ...
- 实现android"转盘抽奖"小项目后感想
我这次做的小项目是android的转盘抽奖,因为这个小项目中有进程的调度,加锁等细节,而我们组的竞赛系统中也有这样的问题.通过这次的实践我发现了自己的好多问题也学到了很多. 个人问题: 1.自己的动手 ...