快速排序(从大到小排序)每一趟都能保证基准左边的数都比基准大,基准右边的数都比基准小。设基准的位置为i,则基准为第i+1大,若k等于i+1则符合条件退出。若i+1>k则说明第k大的数在基准左边,否则在右边。
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
// write code here
//将数组首元素作为每一轮比较的基准,比基准大的数放在左边,比基准小的数放在右边
return find(a, 0, n-1, K);
}
int find(vector<int>& a, int left, int right, int K)
{
int pivot = parti(a, left, right);
if(pivot + 1 < K)
return find(a, pivot+1, right, K);
else if(pivot + 1 > K)
return find(a, left, pivot-1, K);
else
return a[pivot];
}
int parti(vector<int>& a, int left, int right)
{
int tmp = a[left];
int i=left;
int j=right;
while(i < j)
{
//从右边开始找到第一个比基准大的数的位置;
//在下面的循环中若a[j] > tmp就会退出while循环,j就是位置;
while(i < j && a[j] <= tmp)
{
j--;
}
//从左边开始找到第一个比基准小的数的位置;
//在下面的循环中若a[i] < tmp就会退出while循环,i就是位置;
while(i < j && a[i] >= tmp)
{
i++;
}
if(i < j)
{
//交换;
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//首元素与基准交换;
a[left] = a[i];
a[i] = tmp;
return i;
}
};
京公网安备 11010502036488号