有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
  给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。 
   要求:时间复杂度 
,空间复杂度 
  
   数据范围:
, 
,数组中每个元素满足 
  
                                        有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。
[1,3,5,2,2],5,3
2
[10,10,9,9,8,7,5,6,4,3,4,2],12,3
9
去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9
int privot(int a[], int low, int high);
void quicksort(int a[], int low, int high);
int findKth(int* a, int aLen, int n, int K ) {
    // write code here
    quicksort(a, 0, aLen-1);    //从小到大排序
    return a[aLen-K];   //返回第k大的
}
int privot(int a[], int low, int high){         //划分
    int p = a[low];
    while (low < high){
        while(low < high && a[high] >= p) high--;
        a[low] = a[high];
        while(low < high && a[low] <= p) low++;
        a[high] = a[low];
    }
    a[low] = p;
    return low;
}
void quicksort(int a[], int low, int high){     //快排
    if (low < high) {
        int pri = privot(a, low, high);
        quicksort(a, low, pri-1);
        quicksort(a, pri+1, high);
    }
} //快速排序
int Qsort(int *a,int low,int high){
    int t=a[high];
    while(low<high){
        while(low<high&&a[low]>=t){
            low++;
        }
        if(low<high){
            a[high]=a[low];
        }
        while(low<high&&a[high]<=t)
            high--;
        if(low<high)
            a[low]=a[high];
    }
    a[low]=t;
    return low;
}
 void Merge(int*a,int low,int high){
     if(low<high){
         int mid=Qsort(a,low,high);
         Merge(a,low,mid-1);
         Merge(a,mid+1,high);
     }
 }
int findKth(int* a, int aLen, int n, int K ) {
    // write code here
    Merge(a,0,n-1);
    return a[K-1];
    
}
 #define findKth(a, aLen, n, k) __findKth(a, n, n - k, 0, n - 1)
void swap(int* a, int* b) { if (*a ^ *b) *a ^= *b, *b ^= *a, *a ^= *b; }
/**
 * 
 * @param a int整型一维数组 
 * @param aLen int a数组长度
 * @param n int整型 
 * @param K int整型 
 * @return int整型
 */
int __findKth(int* a, int n, int k, int left, int right) {  
  // recursion exit condition
  if (left == right) return *(a + left);
  
  int i = left, j = right, x = *(a + left + ((right - left) >> 1));
  do {
    while (*(a + i) < x) ++i;
    while (*(a + j) > x) --j;
    if (i <= j) swap(a + i++, a + j--);
  } while (i <= j);
  
  if (k <= j)      return __findKth(a, n, k, left, j);
  else if (i <= k) return __findKth(a, n, k, i, right);
  else             return __findKth(a, n, k, j + 1, i - 1);
}