算法导论CLRS 9.2 选择第i小的元素

来源:互联网 发布:淘宝佣金多少 编辑:程序博客网 时间:2024/05/21 15:46
/*9.2 选择第i小的元素 *RANDOMIZED-SELECT */#include<iostream>#include<iomanip>#include<vector>#include<ctime>using namespace std;typedef vector<double>::iterator dvecIte;dvecIte partition(dvecIte iteB, dvecIte iteE){//在返回前,ite1指向不小于*(iteE-1)的队列的最左边的元素dvecIte ite1 = iteB, ite2;for(ite2 = iteB; iteE-1 != ite2; ++ite2) {if( *ite2 < *(iteE-1)) {if( ite1!= ite2) {double temp = *ite1;*ite1 = *ite2;*ite2 = temp;}++ite1;}}//如果ite1为iteE-1,说明iteE-1指向最大值,要将其排出//而且两者相等时不能用^if(ite1 != iteE-1){double temp = *ite1;*ite1 = *(iteE - 1);*(iteE - 1) = temp;}return ite1;//返回*(iteE-1)的确定位置}dvecIte rndPartition(dvecIte iteB, dvecIte iteE){srand((unsigned)time(NULL));dvecIte iteRnd = iteB + rand() % (iteE-iteB);if(iteRnd != iteE-1) {double temp = *iteRnd;*iteRnd = *(iteE - 1);*(iteE-1) = temp;}return partition(iteB, iteE);}double rndSelect(const dvecIte &iteB, const dvecIte &iteE, const size_t i){//返回第i小的元素if(1 < iteE-iteB) {dvecIte ite = rndPartition(iteB, iteE);size_t k = ite - iteB + 1;if(i == k)return *ite;else {if(i < k)return rndSelect(iteB, ite, i);else return rndSelect(ite+1, iteE, i-k);}}return *iteB;} int main(){size_t i;//必须输入正整数,不然小数部分会传递给下面的容器cout<<"求第几小的元素?"<<endl;cin>>i;double inData;vector<double>dvec;cout<<"输入一系列数,以文件结束符结尾!"<<endl;while(cin>>inData)dvec.push_back(inData);cout<<"第"<<i<<"小的元素是:"<<setw(5)<<rndSelect(dvec.begin(), dvec.end(), i)<<endl;system("PAUSE");return EXIT_SUCCESS;}