码迷,mamicode.com
首页 > 其他好文 > 详细

第k大的数

时间:2020-03-14 19:48:41      阅读:38      评论:0      收藏:0      [点我收藏+]

标签:code   方法   span   art   pre   div   快速排序   复杂   ++   

排序的方法就不说了

这里记录一下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大的数

标签:code   方法   span   art   pre   div   快速排序   复杂   ++   

原文地址:https://www.cnblogs.com/lxzbky/p/12493706.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!