寻找T的第k小元素
寻找第n/2小元素--》中值问题
k=s rs就是第k小元素
k<s rs在左边序列中
k>s rs在右边序列中
#include<iostream>
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;
j--; //右边的指针向左移动
}
}
//循环结束i=j时候
//返回i的坐标就是中间值
return i;
}
int SelectMink(int r[],int k,int low,int high)
{
//选择问题的实现 k是待查找的数
int s;//s是要找的轴值 (位置坐标)
s= Partition(r,low,high);
//如果在中间,就直接返回找到了 !查找成功
if(s==k){
return r[s];
}
//如果k<r[i] 在左边递归查找
else if(k<s){
return SelectMink(r,k,low,s-1);
}
//如果k>r[i] 在右边递归查找
else{
return SelectMink(r,k,s+1,high);
}
}
int main(){
cout<<"请输入数据总数:"<<endl;
int n;
cin>>n;
int r[n];
cout<<"请输入数据:"<<endl;
for(int i=0;i<n;i++){
cin>>r[i];
}
int k; //传入的是数据的位置坐标
cout<<"请输入想查找的第k个元素:"<<endl;
cin>>k;
k=k-1;
int low=0,high=n-1;
int res=SelectMink(r,k,low,high); //要找的是排行老四位置的数是多少
cout<<res;
}