#include<iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>
#define Random(x) (rand()%x)
template<class Type>
void Swap(Type &m,Type &n){//交换两个数
Type temp = m;
m = n;
n = temp;
}
template<class Type>
int Partition(Type a[],int p,int r){
int i = p,j = r + 1;
Type x = a[p];
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>
int RandomizedPartition(Type a[],int p,int r){
srand((int)time(0));
int i = p + rand()%(r-p);
Swap(a[i],a[p]);
return Partition(a,p,r);
}
template<class Type>
void RandomizedQuickSort(Type a[],int p,int r){
if(p < r){
int q = RandomizedPartition(a,p,r);
RandomizedQuickSort(a,p,q-1);
RandomizedQuickSort(a,q+1,r);
}
}
void Output(int a[],int n){
for(int i = 0;i < n;i++)
cout<<a[i]<<" ";
}
template<class Type>
Type RandomizedSelect(Type a[],int p,int r,int 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);
}
void main(){
int k;
int a[7] = {49,38,65,97,76,13,27};
cout<<"数组如下"<<endl;
Output(a,7);
RandomizedQuickSort(a,0,6);
cout<<"\n排序后数组元素如下"<<endl;
Output(a,7);
cout<<endl<<"输入k(0<k<8):";
cin>>k;
cout<<"第"<<k<<"小的数为"<<endl;
cout<<RandomizedSelect(a,0,6,k);
cout<<endl;
}
递归分治解决快速排序和限行时间选择
最新推荐文章于 2021-05-19 15:09:51 发布