使用快排思想找第K大的数,算法复杂度O(n)。
1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分;
如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第K小的数,则与此相反。
划分过程与快排相同,使用两个指针i和j分别指向数组的首尾,根据指针所指元素与基准base的大小交替移动两个指针,直到两个指针指向同一个位置i==j,此时i或j即为base的下标.
2.当K-1大于base的索引i(或j)时,所要找的第K大的数位于base的后半部分,需要对后半部分进行排序,而不用管前半部分的顺序;
当K-1小于base的索引时,所要找的第K大的数位于base的前半部分,只需要对前半部分进行排序;
当K-1等于base的索引时,说明当前的base就是所要找的第K大的数。
使用递归方法对所需要排序的部分进行排序。
#include <iostream>
#include <vector>
using namespace std;
// 找第K小的数
void findKthSmaller(