找出一段数中的第K最大的数:k_Max
来源:互联网 发布:s7200plc密码破解软件 编辑:程序博客网 时间:2024/05/16 01:34
先上代码:(时间复杂度后面分析>_<)
#include<iostream>
#include<stdio.h>#include<stdlib.h>
#include<time.h>
using namespace std;
void exchange(int *a,int *b)
{
if(a!=b)
{
int t=*a;
*a=*b;
*b=t;
}
}
int partition(int *a,int left,int right)
{
int x=a[right];
int i=left-1;
int j=left;
for(;j<right;++j)
{
if(a[j]>=x)
{
++i;
exchange(&a[i],&a[j]);
}
}
exchange(&a[i+1],&a[right]);
return i+1;
}
int randomized_partition(int *a,int left,int right)
{
srand((int)time(0));
int i=rand()%(right-left+1)+left;
if(i!=right)
exchange(&a[i],&a[right]);
return partition(a,left,right);
}
int Randomized_Select(int *a,int left,int right,int k)
{
if(left==right)
return a[left];
int q=randomized_partition(a,left,right);
int key=q-left+1;
if(key==k)
return a[q];
else if(k<key)
return Randomized_Select(a,left,q-1,k);
else
return Randomized_Select(a,q+1,right,k-key);
}
int main()
{
int a[10]={1,9,2,8,10,3,4,7,6,5};
int k;
cin>>k;
int k_max=Randomized_Select(a,0,9,k);
cout<<k<<" Max: "<<k_max<<endl;
return 0;
}
期望为线性时间的选择算法
时间复杂度:
0 0
- 找出一段数中的第K最大的数:k_Max
- 找出数组中第K个最大的数
- 写一段程序,找出数组中第k大小的数,输出数所在的位置。
- 写一段程序,找出数组中第k大小的数,输出数所在的位置。
- 求在一组N个的数中找出第K个最大数
- 找出第K大的数
- 找出第k大的数
- 找出第k大的数
- 找出第K大的数<数组>
- 找出第k大的数
- 找出第K小的数
- 求第K个最大的数
- 【每天学点算法题10.18】找出数组中的第K大的数
- 无序数组找出其中的第K大的数
- 找出数组中第k大小的数
- 找出第k大的数[No. 64]
- 选择问题(找出第k小的数)
- 数组试题---找出第k大的数
- poj 2229 Sumsets
- cacheColorHint,android:listSelector属性
- 2017年2月8日
- Sql注入漏洞问题
- HDOJ(HDU).1241 Oil Deposits(DFS)
- 找出一段数中的第K最大的数:k_Max
- C实例---进制转换(栈实现)
- golang语法学习(二):控制语句,函数,以及错误处理。
- UVa1586 - Molar mass还是画流程图思路清晰
- 开源项目集合
- 关于数据库中的主键的自动增长
- 蓝桥杯-第七届省赛javaC组- 有奖猜谜
- hbase 设置TTL释放空间
- 新年上班第一天,我的 IDE 挂了