排序算法——小顶堆

堆排序算法(图解详细流程) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录堆排序基本介绍大顶堆举例说明小顶堆举例说明堆排序的基本思想堆排序步骤图解说明堆排序的基本思路总结 堆排序基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏最好,平均时间复杂度均为O(nlogn),他也是不稳定排序 堆是具有以下性质的完全二叉树,每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子的值的大小关系。 每个结点的值都小于或等于其左 阅读详情

一、小顶堆原理

小顶堆实际上是一个二叉树,满足:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]规则,即根节点既小于或等于左子树的关键字值,又小于或等于右子树的关键字值。
在这里插入图片描述

二、应用场景

比如求10亿个数中的最大的前10个数,时时构建只有10个元素的小顶堆,如果比堆顶小,则不处理;如果比堆顶大,则替换堆顶,然后依次下沉到适当的位置。

三、代码实现

import java.util.Arrays;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 */
public class SmallHeap {
	/**
	 * <description>获取前N数据</description>
	 *
	 * @param arr
	 * @param n
	 * @date: 2018年10月16日 下午4:52:27
	 */
	public static int[] topN(int[] arr, int n) {
		/**
		 * 构建堆积
		 */
		int[] list = new int[n];
		System.arraycopy(arr, 0, list, 0, n);
		for (int i = 0; i < n; i++) {
			int t = i;
			while (t != 0 && list[parent(t)] > list[t]) {
				swap(list, t, t = parent(t));
			}
		}
		
		/**
		 * 小顶堆
		 */
		for (int i = n, len = arr.length; i < len; i++) {
			if (arr[i] >= list[0]) {
				// 置换栈顶
				list[0] = arr[i];
				// 调整栈顶
				int t = 0;
				while ((left(t) < n && list[t] > list[left(t)]) || (right(t) < n && list[t] > list[right(t)])) {
					if (right(t) < n && list[right(t)] < list[left(t)]) {
						swap(list, t, t = right(t));
					} else {
						swap(list, t, t = left(t));
					}
				}
			}
		}
		return list;
	}
	
	/**
	 * <description>对象交换</description>
	 *
	 * @param list
	 * @param i
	 * @param j
	 * @date: 2018年10月16日 下午4:56:33
	 */
	private static void swap(int[] list, int i, int j) {
		int tmp = list[i];
		list[i] = list[j];
		list[j] = tmp;
	}
	/**
	 * <description>父节点索引</description>
	 *
	 * @param i
	 * @return
	 * @author: ouyp
	 * @date: 2018年10月16日 下午3:34:22
	 */
	private static int parent(int i) {
		return (i - 1) / 2;
	}
	
	/**
	 * <description>左孩子索引</description>
	 *
	 * @param i
	 * @return
	 * @author: ouyp
	 * @date: 2018年10月16日 下午4:01:30
	 */
	private static int left(int i) {
		return 2 * i + 1;
	}
	
	/**
	 * <description>右孩子索引</description>
	 *
	 * @param i
	 * @return
	 * @author: ouyp
	 * @date: 2018年10月16日 下午4:02:04
	 */
	private static int right(int i) {
		return 2 * i + 2;
	}
	
	public static void main(String[] args) {
		int[] arr = new int[]{56, 30, 71, 18, 29, 93, 44, 75, 20, 65, 68, 34};
		System.out.println("原始数组: ");
		System.out.println(Arrays.toString(arr));
		System.out.println("调整后数组: ");
		System.out.println(Arrays.toString(SmallHeap.topN(arr, 5)));
	}
}

四、参考链接

  1. 如何在10亿数中找出前1000大的数
  2. 大顶堆和小顶堆–Java版
  3. 堆排序,大顶堆,小顶堆
排序算法——堆排序(大顶堆、小顶堆) 堆排序的思想这里就先不讲了,以后有时间再补上,下面是分别采用大顶堆和小顶堆实现的堆排序。 注意:下面例子中排序的数字是{1,2,5,3,6,4,9,7,8}。 大顶堆方式 #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; //堆调整 //将nums[s..m]调整为大顶堆,其中除了nums[s... 阅读详情

相关推荐

【软考】数据结构 - 堆结构(小顶堆、大顶堆和二叉堆)

大顶堆(Max Heap)是一种特殊的堆结构大顶堆堆的每个节点的值都大于或等于其子节点的值大顶堆通常用于实现优先队列,其中堆顶元素是最优先的元素。大顶堆是一种大于等于父节点的二叉堆,即每个节点的值都不小于其父节点的值。大顶堆的性质为堆顶元素不小于其子节点,即堆顶的值不小于其子节点的值。小顶堆(Min Heap)也是一种特殊的堆结构小顶堆的每个节点的值都小于或等于其子节点的值小顶堆通常用于实现优先队列,其中堆顶元素是最不优先的元素。

奶爸的编程之路,也就一周冷个三天 1910

数据结构:大顶堆、小顶堆

堆是其中一种非常重要且实用的数据结构。堆可以用于实现优先队列,进行堆排序,以及解决各种与查找和排序相关的问题。大顶堆和小顶堆都是堆数据结构的变种,它们分别能够在 O(1) 时间内访问最大和最小元素。无论是大顶堆还是小顶堆,插入元素和删除堆顶元素的时间复杂度都是 O(log n),其中 n 为堆中的元素数量。

crr411422的博客 1万+

数据结构 小顶堆建堆过程 构建过程

【一】简介 最小堆是一棵完全二叉树,非叶子结点的值不大于左孩子和右孩子的值。本文以图解的方式,说明最小堆的构建、插入、删除的过程。搞懂最小堆的相应知识后,最大堆与此类似。 最小堆示例: 【二】最小堆的操作 最小堆的构建: 初始数组为:9,3,7,6,5,1,10,2 按照完全二叉树,将数字依次填入。 填入完成后,从最后一个非叶子结点(本示例为数字6的节点)开始调整。 根据性质,小的数字往上移动;至此,第1次调整完成。 注意,被调整的节点...

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 1万+

堆排序思想和案例图解

堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了 步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。   a.假设给定无序序列结构如下 2.此时我们从最后一个非...

Peter_Changyb的博客 8521

Java:实现大顶堆和小顶堆排序算法(附完整源码)

Java:实现大顶堆和小顶堆排序算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 440

景区导览系统|景区展馆智能导览|小程序导览|电子导览手绘地图制作

AI 数字导游就像一位随时陪伴在游客身边的专属导游,能够根据游客的提问,迅速、准确地提供详细的景点介绍、历史文化知识讲解,甚至能根据游客的兴趣爱好和实时位置,为其智能规划个性化的游览路线。在手绘地图中可以显示景区中的景点信息、景点和景点之间的路径,也可以显示景区的关键地点信息:景区全景、植物景观、河流、道路、地形面貌、卫生间等公共设施~无论是景区还是展馆,道可云AI智能导览系统都能通过丰富的功能、先进的技术,为游客打造便捷、智能、个性化的游览体验,成为文旅行业数字化转型的得力助手。

道可云 1143

建小顶堆和大顶堆排序算法(数据结构经典)

/************************************************************ Function: 堆排序 Author: glq2000[glq2000@126.com] Date: Tues, 2010-8-3 Note: 写堆排序函数要注意两个问题 1. 如何由一个无序序列建立一个堆? 2. 如何在输出堆顶元素后,调整剩余元素成

zc707212993的专栏 3011

opencv-meshgrid

使用opencv::repeat函数和std::iota函数完成meshgrid功能。 X Y Z 通俗的说就是根据Z的大小生成X矩阵,Y矩阵

yuegooxi的博客 1607

Java:实现大顶堆和小顶堆排序算法(附带源码)

Java:实现大顶堆和小顶堆排序算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1187

遥感数据下载——FIRM:VIIRS火点数据、MODIS火点数据简介及下载

一、FIRMS(Fire Information for Resoutce Management System) 网站链接:https://firms.modaps.eosdis.nasa.gov/map/ 这个网站上对VIIRS及MODIS的火灾数据进行了显示,可以进行按日期、产品类别等动态的展示火点数据或火烧迹地,同时也提供了数据下载控件。高级选择中还可以进行数据统计结果展示。 二、VIIR...

knkn123的博客 3万+

静态分析工具COBOT与Testbed对比

Testbed为规则检查工具的代表,市场占有量非常大,但随着时间的推移,大家从规则匹配转向了用静态分析工具检查Bug,所以规则检查型工具占有量比开始时候已经减少,但仍有一些比较落后的单位还在继续采购此类工具。3、通过对开源工程的测试,进行误漏报率的对比,发现COBOT(库博)的误漏报率相比Testbed较低,因COBOT主打国内市场,在众多军工单位进行大量试用及使用,吸取了众多单位的意见和建议,更加符合国内军工单位的使用习惯及测试要求。4、此外库博在功能上还可以进行计划任务,检测队列,检测并发的功能支持。

chengoodflower的博客 2055

大顶堆小顶堆java_《排序算法》——堆排序(大顶堆,小顶堆,Java)

十大算法之堆排序:堆的定义例如以下:n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。" ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"若将和此次序列相应的一维数组(即以一维数组作此序列的存储结构)看成是一个全然二叉树,则全然二叉树中每个节点的值的都大于或等于随意一个字节的...

weixin_39842475的博客 168

混合动作空间在强化学习中的创新应用:PDQN与MPDQN算法解析

本文深入解析了强化学习中处理混合动作空间的PDQN与MPDQN算法。针对既有离散选择又有连续调节的复杂决策场景,PDQN通过参数化深度Q网络,巧妙结合DQN与DDPG进行交替优化;MPDQN则进一步改进,为每个离散动作提供专属参数评估以减少干扰。文章通过游戏、自动驾驶等实例阐述了其应用价值与面临的挑战。

efc123456的博客 863

【剑指offer中的排序算法】推排序(大顶堆/小顶堆)/归并排序

堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: 小顶堆:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2] 大顶堆:Key[i]>=Key[2i+1]&&key>=key[2i+2] 题:如何得到一个数据流中的中位数?(动态、实时,在任意时刻都能够直接拿到我们想要的均值而不去计算下标取值) 思路: 需要求的...

weixin_44718349的博客 343

temu登录接口逆向分析(含Py纯算)

【代码】temu登录接口逆向分析(含Py纯算)

数据精灵喵 1944

【项目实战】主流车载操作系统,QNX实时操作系统入门介绍

QNX是一种实时操作系统,自1980年代初期由Quantum Software Systems成立以来,已被广泛应用于各种行业和领域。QNX具有实时响应、高可靠性和分布式等特点,为各种设备提供了强大的底层操作系统平台。随着科技的不断发展和进步,QNX系统的应用范围和潜力也在不断扩大。本文将全面介绍QNX系统,包括其引言、背景、系统特性、应用领域和生态系统等方面。QNX作为一种实时操作系统,具有高效的实时性能、高可靠性、分布式、可剪裁性和可扩展性等特点。它在各个领域都有广泛的应用,并拥有一个庞大的生态系统。

奶爸的编程之路,也就一周冷个三天 3068

小顶堆排序

小顶堆排序 public class 小顶堆输出 { /* 小顶堆分两大步:1堆化2排序 *堆化: 最重要的分为三段 * 1。考虑边界问题; * 2、比较左右孩子更小的; * 3、找到了换还是不换的问题。 */ public static void main(String[] args) { int arr[]={78,56,34,43,4,1,15,2,23}; sort(arr); for(int i=0;i<arr.length;i++) { System.out

无雨 671

一键生成Microsoft Store应用直链下载:绕过商店故障的终极方案

遇到商店无法加载时,复制链接 → 粘贴到Adguard → 下载主程序包 → 开启开发者模式安装。整个过程耗时不超过2分钟,彻底摆脱商店依赖!

安德洛夫 2185

《排序算法》——堆排序(大顶堆,小顶堆,Java)

十大算法之堆排序: 堆的定义如下:   n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。   " ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"   若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,   则完全二叉树中每一个节...

Thinkgamer博客 4706

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

堆排序是一种基于二叉堆数据结构的高效排序算法,它利用堆的特性(大顶堆或小顶堆)来实现排序,时间复杂度为**O(n log n)*

堆是一种完全二叉树(除最后一层外,每层节点都完全填满,最后一层节点从左到右依次排列),分为两种类型: - **大顶堆**:每个父节点的值都大于或等于其左右子节点的值。 - **小顶堆**:每个父节点的值都小于或等于其左右子节点的值。

[Blog][Domain] programb.blog.youkuaiyun.com 797

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: Pitfalls of sharing a connection among threads
下一篇: JS实现数组按照【数字 > 字符串 >汉字拼音】排序——类似EXEL筛选
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值