第i小元素

来源:互联网 发布:mac virtualbox传文件 编辑:程序博客网 时间:2024/05/02 04:27

在一个含有n个不同数的集合中找到第i小的元素。

利用分治的思想,算法的平均时间为O(n)

#include <time.h>#include <iostream>using namespace std;int Partition(int A[],int p,int r){int x=A[r],i=p-1,j,temp;for(j=p;j<r;j++){if(A[j]<=x){i++;temp=A[j];A[j]=A[i];A[i]=temp;}}temp=A[r];A[r]=A[i+1];A[i+1]=temp;return i+1;}int Random_Partition(int A[],int p,int r){srand((unsigned int)time(0));int i=(rand()%(r-p+1))+p;  //get the random num from[p,r]int temp=A[r];A[r]=A[i];A[i]=temp;return Partition(A,p,r);}//利用快排分治的思想,进行划分求解数组中的第i小元素int Random_Select(int A[],int p,int r,int i){//return the ith min num int the A[]if(p == r)return A[p];int q=Random_Partition(A,p,r);int k=q-p+1;if(i == k)return A[q];else if(i < k)return Random_Select(A,p,q-1,i);elsereturn Random_Select(A,q+1,r,i-k);}int main(){int A[9]={12,5,21,6,32,8,11,9,14};int i,p,j;cout<<"输入一个整数,求数组中的第i小元素,输入0结束"<<endl;while(cin>>i){if(i == 0)break;else if(i>9)cout<<"数组元素个数少于 "<<i<<endl;else{p=Random_Select(A,0,8,i);for(j=0;j<9;j++)cout<<A[j]<<"  ";cout<<endl;cout<<"数组中的第 "<<i<<" 小元素是:"<<p<<endl;}}return 0;}

运行结果

输入一个整数,求数组中的第i小元素,输入0结束35  6  8  9  11  21  12  14  32数组中的第 3 小元素是:865  6  8  9  11  12  14  32  21数组中的第 6 小元素是:120Press any key to continue