寻找第k元
要求:给定一个数组array[n],寻找大小排在第k的元素
思路一:最直接的思路就是先排序,这样可以直接通过数组下标找到第k大的元素,最好的快速排序时间复杂度为O(nlogn)。
思路二:我们可以在快速排序的基础上进行改进,即运用快速排序框架,不过快速排序中的基准元素,我们采用随机划分而不是快速排序那样指定为一个固定的值。此方法时间复杂度为O(n)
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<time.h>
using namespace std;
int random(int p,int r)
{
return (rand()%(r-p+1)+p); }
int partion(float a[],int p,int r)
{
int x = a[r];
int i=p-1;
for(int j = p;j<r;++j){
if(a[j]<=x){
++i;
swap(a[i],a[j]);
}
}
swap(a[i+1],a[r]);
return i+1;
}
int part(float a[],int p,int r)
{
int i=random(p,r);
swap(a[i],a[p]);
return partion(a,p,r);
}//该算法的主体框架为快速排序的框架,但与快速排序不同的是,快速排序是通过递归框架
//对数组进行排序,但此算法通过递归框架只对数组中的第k元进行筛选,所以递归的出口不同
//快速排序中的递归出口为if(high>low),但该函数的递归出口为if(k-1==i-p)
//与快速排序相同的是都存在一个划分过程
//如果单是求第k元的话,该函数的参数可以简化,即p=0,这样j==i
float select(float a[],int p,int r,int k)
{//在数组a中从下标p到r中求第k小的元素
if(p==r)
{
return a[p];
}
int i=part(a,p,r);//对数组a随机划分
int j=i-p;//+1;//此处之所以要i-p因为该函数从数组p下标开始,而不一定从0开始
if(k-1==j)//因为数组下标从0开始,所以第k小元素下标为k-1
return a[i];//递归出口,返回该元素
else if(k-1<j)
return select(a,p,i-1,k);
else
return select(a,i+1,r,k-j-1); }
void bubble(float a[], int n)
{
int i,flag=1;
for(i=1;i<=n-1&&flag;i++)
{
flag=0;
for(int j=0;j<n-i;j++)
{
if(a[j+1]<a[j])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1; } }
}
}
int main()
{
int n,t,i,j=0;
cout<<"请输入元素的个数n"<<endl;
cin>>n;
// float *p=(float *)malloc(n*sizeof(float));
float *p=new float[n];
cout<<"请输入每个元素的值"<<endl;
for(i=0;i<n;i++)
{
cin>>p[i];
}
cout<<"请输入要寻找第k元的k值"<<endl;
int k;
cin>>k;
cout<<select(p,0,n-1,k)<<endl;
return 1;
}
寻找第k元的更多相关文章
- 寻找第K大的数
在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...
- [SOJ]寻找第k大数字(numberk)
Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...
- 快速选择算法/Select 寻找第k大的数
参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...
- 分治算法--寻找第k大数
问题描述:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k大的元素,(这里给定的线性集是无序的). 其实这个问题很简单,直接对线性序列集qsort,再找出第k个即可.但是这样的 ...
- 寻找第K大的数(快速排序的应用)
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数.给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在.测试样例:[1,3,5,2,2],5, ...
- XJTUOJ wmq的队伍(树状数组求 K 元逆序对)
题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...
- P3290 寻找第K大数
描述 寻找第K大数 N个小朋友在一起做游戏.每个小朋友在自己的硬纸板上写一个数,然后同时举起来.接着,小y老师提一个问题,看哪个小朋友先抢答出来.问题是:在这N个数中,第K大的是哪个数?请你编程完成. ...
- 数组,寻找第K大的数
时间复杂度 O(n) def partition(data,left,right): if (len(data)<=0 or left<0 or right>=len(data)): ...
- (寻找第K小的数&&寻找第K小的数的和)
这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...
随机推荐
- super 关键字
- RestTemplate的异常:Not enough variables available to expand
原因:RestTemplate使用出错,我的情况是不知道这里要求用RestTemplate的使用格式,应该很多人都是这样吧?不过,看了下RestTemplate,感觉其实还是很好用的. RestTem ...
- 再谈RunLoop
RunLoop 一 概述: 一句话解释RunLoop:运行任务的循环. 为什么要有RunLoop:解决交互式UI设计中的一个问题,如何快速响应用户输入,如何快速将程序运行结果输出到屏幕? 计算机是个笨 ...
- Swift基础之CoreData的使用
以前使用过OC版本的CoreData应该很好理解Swift方式,所以这里简单的展示一下,增删改查的方法使用,同时给大家说一下创建步骤,方便大家的使用,转载请注明出处,谢谢~ 步骤一:创建一个Swift ...
- Zookeeper的安装部署
1.Zookeeper的安装部署 7.1 Zookeeper工作机制 7.1.1.Zookeeper集群角色 Zookeeper集群的角色: Leader 和 follower (Observer ...
- Android开发技巧——使用Drawable实现小红点
在产品的设计中,总难免需要我们开发去实现各种各样的小红点,小红点,小红点. 通常,我们可能会这样做: 用一个View实现小红点,放在相对布局里,设置好内边距或外边距,让它位于图片的右上角. 或者是给图 ...
- 安卓高级3 RecyclerView结合SwipeRefreshLayout并添加上拉
目录结构: 效果图: MainActivity.java package qianfeng.com.pullrecyclerviewdemo; import android.os.Bundle; im ...
- Scikit-learn:模型评估Model evaluation 之绘图
http://blog.csdn.net/pipisorry/article/details/53001866 绘制ROC曲线 def plotRUC(yt, ys, title=None): ''' ...
- Android安全升级的7.0: Nougat
Tamic http://www.jianshu.com/users/3bbb1ddf4fd5/latest_articles 今年夏天以来,Google做了多种增强的安全性在Android的7.0N ...
- 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i])。问怎么安排这n个请求的顺序,使
有一台机器,上面有m个储存空间.然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i]).问怎么安排这n个请求的顺 ...