选择问题:对于无序序列62,47,54,76,95,34,42,84,72,56,找出第9小的数。写出求解过程及最终结果
#include<stdio.h>
#include <iostream>
#include<iomanip>
using namespace std;
int Partition(int r[],int low,int high) //划分
{
int i=low,j=high;
while(i<j)
{
while(i<j&&r[i]<=r[j])
j--;
if(i<j){
int temp=r[i];
r[i]=r[j];
r[j]=temp;
i++;
}
while(i<j&&r[i]<=r[j])
i++;
if(i<j){
int temp=r[i];
r[i]=r[j];
r[j]=temp;
}
}
return i;
}
int SelectMinK(int r[],int low,int high,int k){
int s;
s=Partition(r,low,high);
if(s==k)
return r[s];
if(s>k)
return SelectMinK(r,low,s-1,k);
else
return SelectMinK(r,s+1,high,k);
}
void main(){
int a[]={62,47,54,76,95,34,42,84,72,56};
int b=SelectMinK(a,0,9,9-1);
cout<<b<<endl;
}
时间复杂度:最好情况O(n) 最坏情况O(n^2)
运行结果: