第k大的数

Posted lxzbky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第k大的数相关的知识,希望对你有一定的参考价值。

排序的方法就不说了

这里记录一下o(n)复杂度的算法

思想,利用快速排序的划分思想,每一次划分会有一个元素处于最终位置

判断这个位置,若所处位置大于k,则向左边寻找

若所处位置大于k,向右边寻找。

int find_K(int a[],int left, int right,int K)
{
    if(left==right)
        return a[left];
    if(left<right)
    {
        int pos = middle_partition(a,left,right);
        if(pos+1==K)
            return a[pos];
        else if(pos+1<K){
            return find_K(a,pos+1,right,K);
        }else{
            return find_K(a,left,pos-1,K);
        }
    }
}

这里犯了个错误,递归边界的问题。

 

所用到的划分算法为

int middle_partition(int A[],int left,int right)
{
    int middle = A[left];
    while(left<right)
    {
        while(left<right&&A[right]>=middle) right--;
        A[left]=A[right];
        while(left<right&&A[left]<=middle) left++;
        A[right]=A[left];
    }
    A[left]=middle;
    return left;
}

 

以上是关于第k大的数的主要内容,如果未能解决你的问题,请参考以下文章

两个有序数组的中位数(第k大的数)

1105 第K大的数(二分)

51nod 1105 第K大的数

从数组中找出第K大的数

51nod p1175 区间中第K大的数

第k大的数