速度比较:
做完整的快排<<<不做完整的快排<<自建堆<不做完整的且随机选择哨兵的快排
贴上最快的代码:
class Solution {
int[] nums;
public int findKthLargest(int[] nums, int k) {
this.nums=nums;
quickSort(0,nums.length-1,k);
return nums[k-1];
}
void quickSort(int left,int right,int k){
if(left>=right)return;
int pos=(int)(Math.random()*(right-left+1))+left;
int pivot=nums[pos];
int tmp=0;
tmp=nums[left];
nums[left]=nums[pos];
nums[pos]=tmp;
int i=left;
int j=right;
while(i<j){
while(i<j&&nums[j]<=pivot)j--;
nums[i]=nums[j];
while(i<j&&nums[i]>=pivot)i++;
nums[j]=nums[i];
}
nums[i]=pivot;
if(i>k-1)quickSort(left,i-1,k);
if(i<k-1)quickSort(i+1,right,k);
}
}
当然也可以自建堆做:
class Heap{
int[] data;
int size;
Heap(int[] data){
this.data=data;
size=data.length;
Heappify();
}
void swap(int i,int j){
int tmp;
tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
int properParent(int i,int j,int k){
int maxpos=i;
if(j<size&&data[i]<data[j])//处理越界
maxpos=j;
if(k<size&&data[maxpos]<data[k])
maxpos=k;
return maxpos;
}
void Heappify(){
for(int i=(size-2)/2;i>=0;i--){
percolateDown(i);
}
}
int delMax(){
int ans=data[0];
swap(0,size-1);
size--;
percolateDown(0);
return ans;
}
int percolateDown(int pos){
int j;
while(pos!=(j=properParent(pos,2*pos+1,2*pos+2))){
swap(pos,j);
pos=j;
}
return pos;
}
}
class Solution {
public int findKthLargest(int[] nums, int k) {
Heap heap=new Heap(nums);
int ans=0;
for(int i=0;i<k;i++){
ans=heap.delMax();
}
return ans;
}
}