陣列中的第K個最大元素--利用堆排序
阿新 • • 發佈:2018-12-12
題:
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
例:
輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4
碼:
void adjustDown(vector<int> &vr,int k,int len){ int tmp=vr[k]; int size=len; for(int i=2*k+1;i<size;i=i*2+1){ if(i+1<size&&vr[i+1]>vr[i]) i=i+1; if(tmp>=vr[i]) break; vr[k]=vr[i]; k=i; } vr[k]=tmp; } void buildMaxHeap(vector<int> &vr){ for(int i=vr.size()/2-1;i>=0;--i){ adjustDown(vr,i,vr.size()); } } //堆排序 void heapSort(vector<int> &vr){ buildMaxHeap(vr); int size=vr.size(); for(int i=0;i<size;++i){ swap(vr[0],vr[size-1-i]); adjustDown(vr,0,size-1-i); } } int findKthLargest(vector<int>& nums, int k) { if(k<1) return -1; buildMaxHeap(nums); int size=nums.size(); if(size==0||size<k) return -1; int res=0; for(int i=0;i<k;++i){ res=nums[0]; swap(nums[size-1-i],nums[0]); adjustDown(nums,0,size-1-i); } return res; }
測:
//測試堆排序
int main(){
vector<int> vr(10);
srand(unsigned(time(0)));
for(int i=0;i<10;++i){
vr[i]=rand()%20;
cout<<vr[i]<<" ";
}
cout<<endl;
heapSort(vr);
for_each(vr.begin(),vr.end(),[](int t){
cout<<t<<" ";
});
return 0;
}