/* Subject:计算机算法设计与分析 Title:2.9 线性时间选择 Coder:Hao Class:计科0906 Num:0304090614 Date: 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; }