classSolution{public:// 快速排序voidquickSort(vector<int>& nums,int start,int end){if(start < end){int base = nums[start];//以要进行排序数组第0个元素为baseint left = start;//左指针int right = end;//右指针while(left < right){//从右向左找,比base大,right--while(left< right && nums[right]>= base){
right--;}//比base小,替换left所在位置的数字
nums[left]= nums[right];//从左向右找,比base小,left++while(left < right && nums[left]<= base){
left++;}//比base大,替换right所在位置的数字
nums[right]= nums[left];}
nums[left]= base;//此时left=right,用base替换这个位置的数字//排列比base小的数字的数组quickSort(nums, start, left -1);//排列比base大的数字的数组quickSort(nums, left +1, end);}}intfindKthLargest(vector<int>& nums,int k){quickSort(nums,0, nums.size()-1);return nums[nums.size()- k];}};
方法三:桶排序(运行时间为O(n))
classSolution{public:// 桶排序intfindKthLargest(vector<int>& nums,int k){// -10000 <= nums[i] <= 10000
vector<int>buckets(20001,0);for(int i =0; i < nums.size(); i++){// nums[i]可能是负数,而且-10000 <= nums[i],所以将nums[i]需要加上一个偏移量10000
buckets[nums[i]+10000]++;}for(int i =20000; i >=0; i--){if(buckets[i]==0){continue;}else{
k = k - buckets[i];if(k <=0){return i -10000;}}}return0;}};
classSolution{public:// 堆排序, 参数i表示开始调整的节点,len表示调整的范围voidheapify(vector<int>& nums,int i,int len){// 这里的结点从0开始,不是从1开始,因此左孩子序号是2*i + 1,右孩子序号是2*i+2int left =2* i +1;int right =2* i +2;// 假设当前节点是最大的int largest = i;// 如果左子节点比当前节点大,更新最大值if(left < len && nums[left]> nums[largest]){
largest = left;}// 如果右子节点比当前节点大,更新最大值if(right < len && nums[right]> nums[largest]){
largest = right;}// 如果最大值不是当前节点,交换最大值和当前节点,并递归调整if(largest != i){swap(nums[i], nums[largest]);heapify(nums, largest, len);}}// 构建大顶堆voidheap_sort(vector<int>& nums){int len = nums.size();// 从最后一个非叶子节点开始,依次向前调整for(int i = len /2-1; i >=0; i--){heapify(nums, i, len);}// 交换堆顶和最后一个元素,再调整堆for(int i = len -1; i >0; i--){swap(nums[0], nums[i]);heapify(nums,0, i);}}intfindKthLargest(vector<int>& nums,int k){heap_sort(nums);return nums[nums.size()- k];}};