查找数组中第K个最小值

来源:互联网 发布:java wait notify 源碼 编辑:程序博客网 时间:2024/05/20 03:07

类似快排,通过partition这个函数找到一个大于左边小于右边的数,如果这个数的序号大于K,在左边查找,小于K在右边查找。一个递归解决问题

代码:

#include<iostream>

using namespace std;

template<typenameE>

int findpivot(EA[], int i, int j)

{

    return (i +j) / 2;

}

template<typenameE>

void swap(EA[], int i, int j)

{

    E temp = A[i];

    A[i] =A[j];

    A[j] = temp;

}

template<typenameE>

int partition(EA[], 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<classE>

E findK(EA[], 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;

}

实现:


原创粉丝点击