2、)将输入数组的n个元素划分为n/5组,每组5个元素,且至多有一个组由剩下的nmod5个元素组成;2)寻找n/5个组中每一组的中位数。(方法首先对每组中的元素进行插入排序,然后从排序过的序列中选出中位数);3)对第2步中找出的n/5个中位数,递归调用SELECT找出其中位数x。(如果有偶数个中位数,根据约定,x是下中位数。)4)利用修改过的PARTITION过程,按中位数的中位数x对输入数组进行划分。让k比划分低区的元素多1,所以x是第k小的元素,并且有n-k个元素在划分的高区;5)如果i=k,则返回x,否则,如果ik
4、e>voidSwap(Type&x,Type&y);inlineintRandom(intx,inty);templateintPartition(Typea,intp,intr);templateintRandomizedPartition(Typea,intp,intr);templateTypeRandomizedSelect(Typea,intp,intr,intk);intmain()vo
5、idSelectionSort(inta);ints;inta2000;intb2000;for(inti=0;i<2000;i+)ai=bi=rand()%10000;cout<6、&s);cout<voidSwap(Type&x,Type&y)Typetemp=x;x=y;y=temp;inlineintRandom(intx,inty)srand(unsigned)time(0);intran_num=rand()%(y-x)+x;returnran_num;templateintPa
7、rtition(Typea,intp,intr)inti=p,j=r+1;Typex=ap;while(true)while(a+ix);if(i>=j)break;Swap(ai,aj);ap=aj;aj=x;returnj;templateintRandomizedPartition(Typea,intp,intr)inti=Random(p,r);Swap(ai,ap);returnPar
8、tition(a,p,r);templateTypeRandomizedSelect(Typea,intp,intr,intk)if(p=r)returnap;inti=RandomizedPartition(a,p,r);intj=i-p+1;if(k<=j)returnRandomizedSelect(a,p,i,k);else/由于已知道子数组ap:i中的元素均小于要找的第k小元素/因此,要找的ap:r中第k小元素是ai+1:r中第k-j小元素。returnRandomizedSelect(a,i+1,r,k-j);voidSelectionSort(inta)intmin;for(inti=0;i<2000-1;