第K大,题目要求使用快排的思想。那么先用快排实现,然后在优化。
写一个快排排序,然后取排序后的第K大的数。
还没完啊,先分析一下:
1.输入一个数组,一个range的其起始位置跟结束位置,随便找一个哨兵,那么进行一番操作之后,
比哨兵大的数都放到右边,比哨兵小的数都放到左边。
2.假设第一次操作完成,右边比哨兵大的数有len个,那么如果len小于K,右边肯定不需要继续排序了,因为第K大的数肯定在左边,
而且在左边的第K-len-1大的数,(需要排除哨兵,多减去一个1)。如果len比K大,那么左边不需要排序了,第K大的数肯定在右边。
3.递归的找下去。处理好边界。
class Solution { public: int findKth(vector<int> a, int n, int K) { // write code here if(a.size() < K){ return -1; } quikSort(a, 0, n-1,K); return a[n-K]; } void quikSort(vector<int> &a,int left,int right,int k){ if(left > right || k <= 0){ return; } int i = left,j = right; int base = a[left]; while(i < j){ while(a[j] > base && i < j){ j--; } while(a[i] <= base && i < j){ i++; } if(i < j){ swap(a[i], a[j]); } } a[left] = a[i]; a[i] = base; int len = right - i; if(len > k-1){ quikSort(a, i+1, right,k); }else if(len < k-1){ quikSort(a, left, i-1,k-len-1); } } };