线性时间选择

来源:互联网 发布:苹果电脑软件安装 编辑:程序博客网 时间:2024/05/19 13:25
/*Subject:计算机算法设计与分析Title:2.9 线性时间选择Coder:HaoClass:计科0906Num:0304090614Date: Oct 2ed,2011 Programming Language:C++*/#include <iostream>using namespace std;//实现功能随机的函数int Random(int p,int r){return rand()%(r-p+1)+p;}//随机划分函数template <class Type>int RandomizedPartition(Type a[],int p,int r){//随机的从p至r中抽取一个数int i=Random(p,r);//将a[i]和a[p]交换Swap(a[i],a[p]);//调用划分函数return Partition(a,p,r);}//用于划分左右数组的函数//p为数组下界,r为上界template <class Type>int Partition(Type a[],int p,int r){int i=p,j=r+1;Type x=a[p];//将小于x的元素交换到左边区域//将大于x的元素交换到右边区域while(true){while((a[++i]<x)&&(i<r));while(a[--j]>x);if(i>=j) break;Swap(a[i],a[j]);}a[p]=a[j];a[j]=x;return j;}//线性时间选择主功能函数template <class Type>Type RandomizedSelect(Type a[],int p,int r,int k){//p为数组下界,r为数组上界,k为待查找位置if (p==r) return a[p];int i=RandomizedPartition(a,p,r),j=i-p+1;if (k<=j) return RandomizedSelect(a,p,i,k);else return RandomizedSelect(a,i+1,r,k-j);}//用于实现数组成员交换的函数template <class Type>void Swap(Type &a,Type &b){Type c;c=a; a=b;b=c;}void main(){int n,k;         cout<<"线性时间选择 by Hao"<<endl<<"请输入数组规模:";    cin>>n;    int *a=new int[n];    cout<<"请输入数组成员:"<<endl;         for(int i=0;i<n;i++)cin>>a[i];           //输入待排序数组       cout<<"查找第K大的数,K为:";cin>>k;cout<<RandomizedSelect(a,0,n-1,k);    cout<<endl;cout<<"END"<<endl;}

原创粉丝点击