平均期望为线性时间的选择算法

从一组无序数据中选择出第i小的元素,采用了快速排序的思想。

#include <iostream>
#include <algorithm>
using namespace std;

int partition(int a[], int l, int r){
    int key = a[l];
    int i=l;
    swap(a[l],a[r]);
    for(int j=l;j<r;j++)
        if(a[j]<key) swap(a[i++],a[j]);
    swap(a[i],a[r]);
    return i;
}
int select(int a[],int l,int r,int i)
{
    if(l==r)
        return a[l];
    int q=partition(a,l,r);
    int k=q+1-l;
    if(k==i)
        return a[q];
    else if(k>i)
        return select(a,l,q-1,i);
    else
        return select(a,q+1,r,i-k);
}
int main()
{
    int a[6] = {5,9,11,23,10,44};
    cout<<select(a,0,8,4);//获取a中第4小的元素,即11.
}

 随机化版本

#include <iostream>
#include <algorithm>
using namespace std;

int rand_partition(int a[], int l, int r){
    int q=l+rand()%(r+1-l);
    int key = a[q];
    int i=l;
    swap(a[q],a[r]);
    for(int j=l;j<r;j++)
        if(a[j]<key) swap(a[i++],a[j]);
    swap(a[i],a[r]);
    return i;
}
int select(int a[],int l,int r,int i)
{
    if(l==r)
        return a[l];
    int q=rand_partition(a,l,r);
    int k=q+1-l;
    if(k==i)
        return a[q];
    else if(k>i)
        return select(a,l,q-1,i);
    else
        return select(a,q+1,r,i-k);
}
int main()
{
    int a[6] = {5,9,11,23,10,44};
    cout<<select(a,0,8,4);//获取a中第4大的元素,即11.
}

 

posted @ 2016-05-15 16:00  CodeMIRACLE  阅读(375)  评论(0编辑  收藏  举报