期望为线性的选择算法

期望为线性的选择算法

 

平时,我们在做从一堆没有排序的数中,找出最大,或者最小,必须要做N-1次比较。

而当我们同时需要找出最大最小值时,我们只需要3|_n/2_|次比较。具体做法是:我们把所有的数分为两组,比较每一组并记录较大和较小的数值,把较大的放在一组找最大的,把较小的放在一组找最小的。

 

但我们在现实中会遇到很多找第i个最小或者最大的值的情况,在这种情况下,我们有更牛的算法,它的期望为线性时间。RANDSOMIZE-SELECT算法,它是以快速排序算法为模型的,与快速排序法不同的是:快速排序法需要递归的处理划分的两边的情况,而RANDSOMIZE-SELECT算法只需要递归的处理一边的情况。

 

算法如下:
RANDOMIZED-SELECT(A,p,r,i)
    if p = r 
        then retrun A[p]
    q= RANDOMIZED-PARTITION(A,p,r)
    k= q-p+1
    if i = k
       then return A[q]
    else if i<k
        return RANDOMIZED-SELECT(A,p,q-1,i)
    else
        return RANDOMIZED-SELECT(A,q+1,r,i-k)
  

RANDOMIZED-PARTITION(A,p,r)
    i=RANDOM(p,r)
    exchange A[r],A[i]
    return PARTITION(A,p,r)
PARTITION(A,p,r)
    x=A[r]
    i=p-1
    for j=p to r-1
    do if A[j]<=x
        i++
        exchange A[i],A[j]//j是为了找比x小的数,而j后面的i是为了记录比x大的数,所以在遇到比x小的数时,就交换位置,完成小的在前,大的在后
    exchange A[i+1],A[r]//最后把x和比大的数交换位置
    return i+1

在PARTITION算法中,这个算法是快速排序算法的关键。而 RANDOMIZED-PARTITION中i的选取是随机的,在最坏的情况下,每次分割的位置元的位置都导致一边没有元素,这样就不能够达到线性了。


版权声明:本文为muzixuanhan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。