查找数组中第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;

}

实现:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值