package Algorithm;
import java.util.PriorityQueue;
public class MaxK {
private static int priorityQueue(int[] a,int k){
PriorityQueue<Integer> queue = new PriorityQueue<>();
for (int i = 0;i < a.length;i++){
if(queue.size()<k){
queue.add(a[i]);
}else{
if(a[i]>queue.peek()){
queue.poll();
queue.add(a[i]);
}
}
}
return queue.peek();
}
private static int adjust(int[] a,int l,int r){
int x = a[l];
while(l<r){
while (l<r && a[r]<=x){
r--;
}
if(l<r){
a[l]=a[r];
l++;
}
while (l<r && a[l]>=x){
l++;
}
if(l<r){
a[r]=a[l];
r--;
}
}
a[l]=x;
return l;
}
private static int quickZhao(int[] a,int l,int r,int k){
if(l<r){
int mid = adjust(a,l,r);
if(mid == k) return a[k];
if(mid > k) return quickZhao(a,l,mid-1,k);
return quickZhao(a,mid+1,r,k);
}
return a[0];
}
public static void main(String[] args) {
int []a = {2,3,5,5,6,7};
int k = 5;
//优先队列方式,维护一个k的小顶堆,java默认为小顶堆 时间复杂度nlogk
System.out.println(priorityQueue(a,k));
//快排方式,时间复杂度 nlogn ,快排下标是从0开始的,所以k-1
System.out.println(quickZhao(a,0,a.length-1,k-1));
}
}
寻找第k大的数(快排思想和优先队列)
最新推荐文章于 2022-01-13 20:32:48 发布
本文介绍两种高效算法来寻找数组中的第K大元素:一种利用优先队列维护小顶堆,时间复杂度为nlogk;另一种采用快速排序思想,平均时间复杂度接近nlogn。这两种方法适用于数据处理与算法优化场景。
321

被折叠的 条评论
为什么被折叠?



