您的位置:首页 > 其它

算法导论--选择第k小的数字,期望时间为n

2017-04-12 16:43 260 查看

期望为线性时间的选择算法

代码:

#include<iostream>
#include<string>
#include<memory.h>
#include<cstdio>
#include<string>
#define NUM 305
using namespace std;

int charaNum[NUM] ;//存放输入数据的数组
int tempArr[NUM];
int dis[NUM];

int Partion(int *A,int left ,int right)
{
int key = A[right];
int i = left -1;
for(int j = left;j<=right-1;j++)
{
if(A[j]<key)
{
i++;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[right]);
return i+1;
}

int random_select(int * A,int left,int right,int i)
{
if(left == right)
{
return A[left];
}
int p = Partion(A,left,right);
int k = p-left+1;
if(i == k)
{
return A[p];
}
if(i<k)
{
return random_select(A,left,p-1,i);
}
if(i>k)
{
return random_select(A,p+1,right,i-k);
}
}

int main()
{
freopen("in.txt","r",stdin);
int num ;
while(cin>>num)
{
for(int i = 0;i<num;i++)
{
cin>>charaNum[i];
}
cout<<random_select(charaNum,0,num-1,5);

cout<<endl;
}

}

输入:


10
16 4 10 14 7 9 3 2 8 1


输出:

7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: