查找数组中第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;
}
實現:
總結
以上是生活随笔為你收集整理的查找数组中第K个最小值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自组织线性表
- 下一篇: 3.定义10个字节的键盘缓冲区,然后键盘