查找数组中第K个最小值

类似快排,通过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;

}

实现:


猜你喜欢

转载自blog.csdn.net/cysisu/article/details/78386931
今日推荐