找出一个数组的最大值和最小值是比较容易的,我们只需遍历一次数组即可。但是寻找一个数组的第i小或者第i大,就需要一些技巧使得查找的时间尽可能小。随机化划分选择算法是一个时间复杂度为O(n)的算法。

int fIndmax(int a[],int p,int r,int i)
{
    if(p==r)
        return a[p];
    int q = RandPartition(a, p, r); // A[q]作为主元将A[p...r]进行划分。
    int k = q - p + 1;           //假设k是要查找的第i小的元素
    if(i==k)                        //如果K=i则主元就是目标元素,如果i<k,则递归地求解左边的序列,如果i>k则递归求解右边的序列
        return a[q];
    else if(i<k)
    {
        return fIndmax(a, p, q-1, i);
    }
    else
        return fIndmax(a, q+1, r, i-k);
}

这个算法的缺点是:如果一个数组中又重复元素,那么得到的结果不是我们期望的结果。解决方法是先删除数组中重复的元素,再利用本算法。 应该还有更好地方法!

 posted on 2014-05-28 21:35  Clivia_zhou  阅读(173)  评论(0编辑  收藏  举报