码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-15 16:39:49      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

从一组无序数据中选择出第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.
}

 

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

标签:

原文地址:http://www.cnblogs.com/CodeMIRACLE/p/5495378.html

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