从数组中找出最小的k个数

2023-11-11

//调整堆(小顶堆) 
void HeapAdjust(int A[],int parent,int length) 
{
	//temp保存当前父节点parent
	int temp=A[parent];
	
	//左子结点开始,i节点的左孩子为2i+1,右孩子为2i+2
	for(int child=2*parent+1;child<length;child=2*child+1)
	{
		//如果右子节点存在,且右子结点小于左子结点,则指向右子结点
		if(child+1<length && A[child]>A[child+1])
		    child++;
		
		//如果(左或右)子节点小于父节点,将子节点值赋给父节点(不用进行交换)
		if(A[child]<temp)
		{
			A[parent]=A[child];
			parent=child;//选取孩子结点的左孩子结点,child=2*child+1,继续向下筛选
		}
		else //若父节点小于(左和右)孩子节点 ,则直接结束
			break;
	}	
		A[child]=temp;//将temp的值放到最终的位置 
}

//建立堆 
void HeapBuild(int A[],int length)
{
	for(int i=length/2-1;i>=0;i--)
	    HeapAdjust(A,i,length)
}

//利用堆找出最小的k个数(小顶堆) 
int getKMinusByHeap(int read[],int k)
{
	if(k<1 || k>read.length())
	    return -1;
	
	int kHeap = new int[k]; //存储k个堆元素 
	
	//初始时一次性从文件中读取k个数据到堆中 
	for(int i=0;i<k;i++)
	    kHeap[i]=read[i];
	
	HeapBuild(kHeap,k); //建小顶堆堆,时间复杂度O(k)
	
	// 从文件中一个一个的读取剩余数据
	for(int i=k;i<read.length();i++)
	{
		if(read[i]<kHeap[0]) //读入的元素小于堆顶元素
		{
			kHeap[0]=read[i];
			HeapAdjust(kHeap,0,k);// 从堆顶开始向下进行调整,时间复杂度O(logk)
		} 
	}
	return kHeap; 
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从数组中找出最小的k个数 的相关文章

随机推荐

  • simunlink的“Three-Phase V-I Measurement”所测线电压次序问题

    simunlink的 Three Phase V I Measurement 所测线电压次序问题 仿真实例 很多同学在使用simulink进行仿真时可能会用到 Three Phase V I Measurement 这个模块 在该模块par
  • np.random.normal()函数

    np random normal 的意思是一个正态分布 normal这里是正态的意思 numpy random normal loc 0 scale 1 0 size shape 参数loc float 正态分布的均值 对应着这个分布的中心
  • osg 的warning C4003: “max”宏的实参不足 error C2589: “(” : “::”右边的非法标记

    原来是需要把max用括号括起来避免和windows定义的宏混淆 std numeric limits max 或者 std max 因为Windef h中定义了 ifndef max define max a b a gt b a b en
  • Oracle中的数据类型——NUMBER

    NUMBER类型概述 NUMBER类型可以用来存储0 正数 负数 数据范围是1 10 130 1 10126 不能等于或者大于1 10126 否则Oracle会报错 算数表达式的结果同理 NUMBER类型的定义 NUMBER precisi
  • 计算机e盘丢失了,电脑E盘突然不见了怎么找回_电脑的E盘突然不见了的解决方法...

    电脑一般会有C D E F等多个磁盘 用于储存不同的程序 方便管理 近期 有用户说自己准备打开E盘安装软件 结果发现E盘突然不见了 这样就没办法把软件安装在E盘上 有什么办法能让E盘恢复 方法有的 现在整理具体操作教程给大家 具体方法如下
  • C++强制类型转换

    C 类型转换 C风格的强制转换 在C 基本的数据类型中 可以分为四类 整型 浮点型 字符型 布尔型 其中数值型包括 整型与浮点型 字符型即为char 1 将浮点型数据赋值给整型变量时 舍弃其小数部分 2 将整型数据赋值给浮点型变量时 数值不
  • 手机网站支付宝支付

    1 支付宝开放平台 支付宝手机网站支付 具体的请求参数和返回参数等相关数据 https docs open alipay com 203 107090 2 支付demo 下载手机网站支付相关的demo 这里的demo和APP支付提供的dem
  • Android webview登录手机QQ

    选择我们的应用 在对应的上述我们定义的QQActivity的onCreate或onNewIntent 如果该activity在栈里出现过 里就能响应了 通过intent取出url 找了url特征字符没有发现token或code 才发现在系统
  • 数据分析之Pandas从入门到放弃:代码+实战,9分钟带你推开Pandas大门!!!

    今天整理了一下Pandas的使用方法 应该是全网整理最完整 最简洁易读 立整 的一篇文章 嗯 别不信 确实是这样的 跟着小鱼 带你9分钟推开Pandas的大门 从此走上数据分析师的苦逼之路 Pandas使用方法 1 Pandas的基本定义
  • 制作个人图片api接口

    制作个人图片api接口 前言 准备工作 过程介绍 操作过程 上传图片到github仓库中 在github中进行项目的发布 编写php文件 引用jsDeliver上的文件 在nginx配置文件中配置好php fpm相关配置 测试 测试php配
  • MFC设计

    细说UI线程和Windows消息队列 转载于 http blog csdn net huasonl88 article details 8589396 0 tsina 1 99086 397232819ff9a47a7b7e80a40613
  • Ubuntu18.04版本安装ssh及连接ssh的常见问题

    下面我们来解决Ubuntu18 04版本安装ssh及连接ssh的常见问题 及解决方法 题外话 安装Ubuntu时会提示一句Please remove the installation medium then reboot 提示这段话 可以直
  • 以太坊网络架构解析

    以太坊网络架构解析 版权 0x7F 知道创宇404区块链安全研究团队 https www cnblogs com southx p 9334639 html 0x00 前言 区块链的火热程度一直以直线上升 其中以区块链 2 0 以太坊为代表
  • 有效服务台管理的5个关键度量指标

    从格言到ITIL 这些标准格言容易与ITSM和ITIL直接联系起来 通过ITIL实施ITSM的一个重要好处是其为持续创建 部署 实施和停役IT服务提供了一个框架 持续改进是ITIL的内在特性 它包含于ITIL服务生命周期管理的持续流程改进
  • python创建和修改yaml文件

    1 创建yaml import os import yaml desired caps train dataTrain 2007 train txt val dataTrain 2007 val txt nc 2 names a b cur
  • MFC调用mysql操作

    要用MySQL提供的C语言API 首先要包含API的头文件目录 也就是在MFC工程属性中的 包含目录 下添加MySQL安装目录的 include 文件夹 因为API是以动态链接库的形式打包的 所以还要在MFC工程属性中的 库目录 下添加My
  • pip安装python库时报Failed building wheel for xxx

    目录 一 问题描述 二 解决办法 1 下载并安装对应的 whl 文件 2 安装 whl 文件 一 问题描述 如题 在使用pip install xxx的方法安装python库 或者是基于python的软件时 报错 ERROR Failed
  • 什么是vuex?(五分钟理解vuex)

    1 什么是vuex 官方的理解是 Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 它采用集中式存储管理应用的所有组件的状态 并以相应的规则保证状态以一种可预测的方式发生变化 Vuex 也集成到 Vue 的官方调试工具 dev
  • 10kV 电压互感器TV高压熔断器熔断可能是什么原因?

    10kV 电压互感器TV高压熔断器熔断可能是什么原因 答 1 当系统在某种运行方式 某种条件下 可能产生铁磁共振 这时也会产生过电压 有可能使TV的激磁电流增加十儿倍 会引起高压侧熔断器熔断 2 系统发生单相间谐电弧接地时 会出现过电压 可
  • 从数组中找出最小的k个数

    调整堆 小顶堆 void HeapAdjust int A int parent int length temp保存当前父节点parent int temp A parent 左子结点开始 i节点的左孩子为2i 1 右孩子为2i 2 for