快排的详细总结可以看
快排的思想就是,每次选一个 pivot(比如最后一个数),然后将比它小的放它左边(或者右边),把比它大的放他右边(或者左边),相当于每次排好一个数,然后递归的排他左右两部分,这个数自己就不会再动了。
面试时经常回问的一道题就是,找出一个数组第 k 大的元素:
LeetCode - 215. Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Example 1:
Input: [3,2,1,5,6,4] and k = 2
Output: 5
Example 2:
Input: [3,2,3,1,2,4,5,5,6] and k = 4
Output: 4
当然这道题可以用一个 heap 完成,用 C++ 写就是 priority_queue,AC代码如下:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int> pq;
for(const int& n : nums)
pq.push(n);
for(int i = 0; i < k - 1; ++i)
pq.pop();
return pq.top();
}
或者其他排序算法比如快排,不过这道题的目的,感觉还是想让你用快排的思想,进行快排,但是提前结束,也就是partition 之后 pi 正好是 k - 1 的情况(从大到小排序),就可以提前结束,AC代码如下:
int partition(int l, int r, vector<int>& n){
int pivot = n[r], idx = l;
for(int i = l; i < r; ++i)
if(n[i] > pivot)
swap(n[idx++], n[i]);
swap(n[idx], n[r]);
return idx;
}
int findKthLargest(vector<int>& nums, int k) {
int l = 0, r = nums.size() - 1, pi;
while(l < r && (pi = partition(l, r, nums)) != k - 1){
if(pi > k - 1) r = pi - 1;
else l = pi + 1;
}
return nums[k - 1];
}