您的位置:首页 > 其它

选择问题-第k小元素

2016-03-27 13:24 375 查看
问题描述:

在一个无序的序列T中,寻找第k小的元素;

分析:

将序列T进行升序排列,下标为K的元素即为第k小的数。(下标从1开始)。考虑到快速排序的过程,每次进行一次Partition()函数,就将比轴线值小的数放在轴线左边,比轴线大的值放在轴线右边,即可确定一个轴线值的下标位置S。下面分三种情况:

1:s==k 即已经找到下表为k的数,return T[s];

2 : s < k 即第k小值在轴线右边;

3:s > k 即第k小值在轴线左边;

再到相应的区间查找即可快速找到结果。

代码:

#include <iostream>

using namespace std;

int Partition(int r[],int low,int high);
int SelectMink(int a[],int low,int high,int k);

int main()
{
int n,k,i,a[1005];
cin>>n>>k;
for(i=1;i<=n;i++)
cin>>a[i];
cout<<SelectMink(a,1,n,k)<<endl;
return 0;
}

int Partition(int a[],int low,int high)
{
int i=low,j=high;
while(i<j)
{
while(i<j && a[i]<=a[j])
j--;
if(i<j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
i++;
}
while(i<j && a[i]<=a[j])
i++;
if(i<j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
j--;
}
}
return i;
}

int SelectMink(int a[],int low,int high,int k)
{
int s = Partition(a,low,high);
if(s==k)
return a[s];
else if(s<k)
{
return SelectMink(a,s+1,high,k);
}
else return SelectMink(a,low,s-1,k);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: