思路:采用堆排序,采取大堆方式,取第k个最大元素排序即可
#include <iostream>
#include <vector>
using namespace std;
//选择排序
// class Solution {
// public:
// int findKthLargest(vector<int>& nums, int k) {
// for (int i = 0; i < nums.size(); i++){
// int min_index = i; // 记录最小值的索引
// for (int j = i; j < nums.size(); j++){
// if (nums[j] < nums[min_index]){
// min_index = j;
// }
// }
// swap(nums[min_index], nums[i]);
// }
// return nums[nums.size() - k];
// }
// };
// class Solution {
// public:
// int aparthSort(vector<int>& nums, int left, int right){
// int i = left, j = right;
// int pivot = nums[left];
// while (i < j) {
// while (i < j) {
// if (nums[j] < pivot) {
// nums[i] = nums[j];
// i++;
// break;
// }
// else
// j--;
// }
// while (i < j) {
// if (nums[i] > pivot) {
// nums[j] = nums[i];
// j--;
// break;
// }
// else
// i++;
// }
// }
// nums[i] = pivot;
// return i;
// }
// int sort (vector<int>& nums, int left, int right, int k) {
// int mid;
// if (left < right){
// mid = aparthSort(nums, left, right);
// if (mid == nums.size() - k) return nums[mid];
// else if (mid > nums.size() - k) return sort(nums, left, mid - 1, k);
// else return sort(nums, mid + 1, right, k);
// }
// else return nums[nums.size() - k];
// }
// int findKthLargest(vector<int>& nums, int k) {
// int res = sort(nums, 0, nums.size() - 1, k);
// return res;
// }
// };
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
buildHeap(nums,nums.size());
int length = nums.size();
for (; length > nums.size()-k; length--) {
swap(nums[0], nums[length - 1]);
buildHeap(nums, length - 1);
}
return nums[nums.size() - k];
}
void buildHeap(vector<int>& nums, int length) {
int left, right = 0;
for (int parent = length / 2 - 1; parent >= 0; parent--){
left = 2 * parent + 1;
right = 2 * parent + 2;
int max = parent;
if (left < length && nums[left] > nums[max])
max = left;
if (right < length && nums[right] > nums[max])
max = right;
if (max != parent){
swap(nums[max], nums[parent]);
parent = max;
}
}
}
};
int main(){
Solution s;
vector<int> nums = {3,2,1,5,6,4};
// vector<int> nums = {1};
int k = 4;
cout << s.findKthLargest(nums, k) << endl;
for (int i = 0; i < nums.size(); i++){
cout << nums[i] << " ";
}
return 0;
}