类似快排,通过partition这个函数找到一个大于左边小于右边的数,如果这个数的序号大于K,在左边查找,小于K在右边查找。一个递归解决问题
代码:
#include<iostream>
using namespace std;
template<typename E>
int findpivot(E A[], int i, int j)
{
return (i + j) / 2;
}
template<typename E>
void swap(E A[], int i, int j)
{
E temp = A[i];
A[i] = A[j];
A[j] = temp;
}
template<typename E>
int partition(E A[], int l, int r, E&pivot)
{
do {
while ((A[++l]< pivot));
while ((l < r) && pivot < A[--r]);
E temp = A[l];
A[l] = A[r];
A[r] = temp;
} while (l < r);
return l;
}
template<class E>
E findK(E A[], int i, int j, int K)
{
if (j <= i)return A[i];
int pivotindex = findpivot(A, i, j);
swap(A, pivotindex, j);
int k = partition<E>(A, i - 1, j, A[j]);
swap(A, k, j);
A[k];
if (k == K-1)return A[k];
else if (k > K-1)return findK<E>(A, i, k - 1, K);
else return findK<E>(A, k + 1, j, K);
}
int main()
{
int array[8] = { 3,5,2,4,10,100,98,99};
cout << findK(array, 0, 7,5 ) << endl;
}
实现: