堆在排序中的应用

堆排序

1、堆排序原理

堆排序是利用到了堆这种数据结构,我们首先回顾一下二叉堆的特性:

  1. 最大堆的堆顶是整个堆中的最大元素。
  2. 最小堆的堆顶是整个堆中的最小元素。

以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。如下图所示:

image-20231129192614158

在删除值为10的堆顶节点后,经过调整,值为9的新节点就会顶替上来;在删除值为9的堆顶节点后,经过调整,值为8的新节点就会顶替上来……

由于二叉堆的这个特性,每一次删除旧堆顶,调整后的新堆顶都是大小仅次于旧堆顶的节点。那么只要反复删除堆顶,反复调整二叉堆,所得到的集合就会成为一个有序集合。

而二叉堆实际是存储在数组中的,堆排序过后数组中的元素排列如下:

image-20231129192924869

综上,堆排序的步骤为:

  1. 把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建成最小堆。
  2. 循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。

2、堆排序的代码实现

堆排序的代码如下如下(升序排列):

/*** “下沉”调整* @param array 待调整的堆* @param parentIndex 要“下沉”的父节点* @param length 堆的有效大小*/
public static void downAdjust(int[] array, int parentIndex,int length) {// temp 保存父节点值,用于最后的赋值int temp = array[parentIndex];int childIndex = 2 * parentIndex + 1;while (childIndex < length) {// 如果有右孩子,且右孩子大于左孩子的值,则定位到右孩子if (childIndex + 1 < length && array[childIndex + 1] >array[childIndex]) {childIndex++;}// 如果父节点大于任何一个孩子的值,则直接跳出if (temp >= array[childIndex])break;//无须真正交换,单向赋值即可array[parentIndex] = array[childIndex];parentIndex = childIndex;childIndex = 2 * childIndex + 1;}array[parentIndex] = temp;
}/*** 堆排序(升序)* @param array 待调整的堆*/
public static void heapSort(int[] array) {// 1. 把无序数组构建成最大堆for (int i = (array.length-2)/2; i >= 0; i--) {downAdjust(array, i, array.length);}System.out.println(Arrays.toString(array));// 2. 循环删除堆顶元素,移到集合尾部,调整堆产生新的堆顶for (int i = array.length - 1; i > 0; i--) {// 最后1个元素和第1个元素进行交换int temp = array[i];array[i] = array[0];array[0] = temp;// “下沉”调整最大堆downAdjust(array, 0, i);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer代码实例中各张量的维度是多少

一下是一个Transformer代码实例&#xff1a; def sample(self, batch_size, max_length140, con_token_list [is_JNK3, is_GSK3, high_QED, good_SA]):"""Sample a batch of sequencesArgs:batch_size : Number of sequences to samplemax_length: Maximum le…

LDF文件分析

文件配置 /* * Copyright (c) 2015 - 2016 , Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * All rights reserved. …

如何利用树莓派与Nginx结合内网穿透服务实现远程访问内部站点——“cpolar内网穿透”

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用语法详解

文章目录 1️⃣ TypeScript常用讲解1.1 使用1.2 字符串1.3 数字1.3 布尔1.4 数组1.5 元组1.6 枚举1.7 any1.8 void1.9 object1.10 函数指定返回值的类型1.11 联合类型1.12 类型断言1.13 接口1.14 函数类型1.15 类类型1.16 泛型 2️⃣ 类2.1 类的基本写法2.2 类的继承2.3 类的修…

❤ 下载返回加密解密

❤功能集合 图片下载 方式一 window.open(URL, name, features, replace) // 新窗口的 URL、窗口名称、窗口特性window.open(row.certificateImageUrl,"_blank", "width500,height400") //打开一个新窗口并且指定长宽参数说明&#xff1a; URL&#xf…

数据结构 | 二叉树的概念及前中后序遍历

数据结构 | 二叉树的概念及前中后序遍历 文章目录 数据结构 | 二叉树的概念及前中后序遍历一、树概念及结构1.1 树的相关概念 二、树的表示2.2 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 三、二叉树概念及结构3.1 二叉树的基本概念3.2 二叉树的结构&a…

文档理解的新时代:LayOutLM模型的全方位解读

一、引言 在现代文档处理和信息提取领域&#xff0c;机器学习模型的作用日益凸显。特别是在自然语言处理&#xff08;NLP&#xff09;技术快速发展的背景下&#xff0c;如何让机器更加精准地理解和处理复杂文档成为了一个挑战。文档不仅包含文本信息&#xff0c;还包括布局、图…

js查询详情接口控制执行时间的命令

在JavaScript中&#xff0c;可以使用console.time()和console.timeEnd()来控制执行时间的命令。 console.time()用于开始计时&#xff0c;可以指定一个标识符作为参数&#xff0c;用于标识计时器。 console.time(query); // 执行查询操作 console.timeEnd(query); 执行上述代…

熟练运用这些黑盒测试知识点,月薪翻倍不是难题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

NX二次开发UF_MTX2_copy 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_copy Defined in: uf_mtx.h void UF_MTX2_copy(const double mtx_src [ 4 ] , double mtx_dst [ 4 ] ) overview 概述 Copies the 2x2 matrix elements from the source m…

快速排序算法的代码及算法思想

快速排序&#xff08;Quick Sort&#xff09;是一种常用的排序算法&#xff0c;他的时间复杂度为O(nlogn) 算法思想: 通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据小&#xff0c;然后再对这两部分数据分别进行快速排…

js修改浏览器地址栏里url的方法

1、更新url某一参数的值 function updateQueryStringParameter(uri, key, value) {if (!value) { return uri }var re new RegExp("([?&])" key ".*?(&|$)", "i");var separator uri.indexOf(?) ! -1 ? "&" : &q…

模糊C均值聚类(Fuzzy C-means clustering,FCM)的基本概念,详细流程以及广泛应用!

文章目录 1.基本概念2. FCM的详细流程3.FCM的应用 1.基本概念 模糊C均值聚类&#xff08;Fuzzy C-means clustering&#xff0c;FCM&#xff09;是一种软聚类方法&#xff0c;它允许数据点属于多个聚类中心&#xff0c;每个聚类中心都有一个权重。与传统的硬聚类方法&#xff…

Visual Studio 2022分析C#程序内存泄漏

背景 最近我们的项目出现了内存激增的情况&#xff0c;初次探讨&#xff0c;我们发现和机器人发生通信之后&#xff0c;内存会缓慢上升&#xff0c;直到系统崩溃。 例子 由于只是介绍一个简单的方案&#xff0c;所以就写一个比较简单的例子来演示了&#xff0c;代码如下&…

Python实现对Windows注册表的增删改查

首先我们需要安装winreg库 pip install winreg注册表常量 ”winreg“总有很多有用的方法&#xff0c;基本上就是操作注册表中的键值&#xff0c;我们挑几个重要的来说说。首先我们来了解下”winreg“中的各个常量&#xff1a; 1.HKEY_ 常量 winreg.HKEY_CLASSES_ROOT #存…

五要素超声波气象站-气象站小百科

随着科技的发展&#xff0c;人们对气象监测的需求也越来越高。为了满足这一需求&#xff0c;一款全新的五要素超声波气象站应运而生。这款气象站不仅具有高精度的测量能力&#xff0c;而且能够实时监测天气变化&#xff0c;为人们提供准确的气象数据。 一、实时监测&#xff0…

34、故事大全API接口,免费好用

1、前言 故事大全查询API接口&#xff0c;这个是RollToolsApi通用系列接口的其中一个&#xff0c;内部包含了3个小接口&#xff0c;可获取睡前故事&#xff0c;儿童故事&#xff0c;格林童话&#xff0c;安徒生童话&#xff0c;民间故事&#xff0c;益智故事&#xff0c;历史故…

python循环语句和函数

1.使用for循环打印9*9乘法表 for i in range(1, 10):for j in range(1, i1):print(i, "*", j, "", i*j, end"\t")print()结果&#xff1a; 2.使用while循环打印9*9乘法表 i 1 while i < 10:j 1while j < i1:print(i, "*", j…

SSD-Single Shot Detector

文章目录 SSD模型主要改进点模型说明训练Choosing scales and aspect ratios for default boxesMatching strategyTraining objectiveHard negative miningData augmentation实验结果基本网络参数PASCAL VOC2007模型消融实验PASCAL VOC2012COCO推理速度比较前面提到了两种经典的…

moment.js的使用

更多可参见官方文档&#xff1a;Moment.js 中文网 | 开发文档