堆排序

什么是堆排序 堆排序是使用二叉堆这样强大的数据结构来实现的排序 回顾:二叉堆的特性 二叉堆本质上是一种完全二叉树 最大堆(最小堆)的堆顶是整个堆中的最大(最小)元素 原理 当我们删除一个最小堆的堆顶的时候是把堆顶的元素删除,并把最后一个元素拿到堆顶 这时如果我们不把堆顶元素删除,而是把堆顶和最后一个元素替换,并把堆的有效长度减1 之后向下调整67,使堆保持稳定 重复上述操作将现在有效长度内的最后... 阅读详情

 

堆排序总结


堆排序思想:最大堆的堆顶元素是全部数据中的最大值,输出这个值
。再将剩余元素整理成新的最大堆,此时堆顶元素又是剩余元素
的最大值,再输出这个值。继续这个过程,每次输出堆顶元素,并将
剩余元素整理成新的最大堆再输出...

堆排序要解决的几个问题
1:如何将数据排列成堆的形式——初始堆的建立
2:输出堆顶元素后,剩余元素如何再整理成新的堆——堆的整理
3:输出元素放在什么位置

预备知识:
1: 堆中的元素存储在一个数组中,根据堆中的各元素之间具有
有序性关系,可以使用二叉树的方式来表示一个堆。因为各元素从前
至后存放在数组的钱n 个单元中,所以所画的二叉树实际上是一颗完全
二叉树
2: 所以根据完全二叉树的性质,数组前一半的数据都是分值节点,后一半
的数据都是叶子节点
3: 即如果有七个数,分别占据数组的a[1]-a[7],那么7/2=3,所以a[1],
    a[2],a[3]为分支节点,剩下的为叶子节点
4: a[i]的左儿子为a[i*2],右儿子为a[i*2+1],如a[1]的左右儿子分别为
    a[2]与a[3]。(这有赖于数组从a[0]开始,还是从a[1]开始)

建堆的过程:
    见代码,见实例图

/*********************************************************/
  /*数组从下标1开始*/
 
 #include<iostream>
  #define L(t) ((t)<<1)
 #define R(t) ((t)<<1 | 1)
 usingnamespace std;
 
 intconst NUMBER = 1000;
 int trees[NUMBER];
 int N;
 /*********************************************************/
 void swap(int &a,int &b){
     int temp = a;
     a = b;
     b = temp;
 }
 /*********************************************************/
 //a[i]元素向下沉,此时堆中的实际元素为n,被甩在后面的元素
 //已经不用管了
 void ShiftDown(int i,int n){
     int child;
    //i<=n/2说明trees[i]为分支结点
    //i=child;该句在循环最后执行,即从上往下递归判断
    //新的位置是否已经稳定,不稳定继续下沉
     for(;i<=n/2;i=child){
         child = i*2;//先试着将预交换的元素设为左儿子
         if((child != n) && trees[child+1]>trees[child])
             child=child+1;//如果右儿子比左儿子大
                          //则将预交换儿子设置为右儿子
         if(trees[child]>trees[i])//如果该节点不如较大的
                                 //儿子大,则下沉(及交换)
             swap(trees[child],trees[i]);
     }
 }
 /*********************************************************/
 void HeapSort(){
    //该循环极为初始堆的建立,从最后一个分支结点开始
     for(int i=N/2;i>=1;i--){
         ShiftDown(i,N);
     }
    //每次循环首先使堆顶元素和首元素交换,再将首元素
    //下沉到合适的位置,记得每次实际堆中元素减1
     for(int i=N;i>=1;i--){
         swap(trees[1],trees[i]);//最大的放到末尾
         ShiftDown(1,i-1);      //所以此时的实际数量为i-1
     }
 }
 /*********************************************************/
 int main(){
     while(cin>>N&&N!=0){
         for(int i=1;i<=N;i++)
             cin>>trees[i];
         HeapSort();
         for(int i=1;i<=N;i++)
             cout<<trees[i]<<" ";
         cout<<endl;
     }
     return0;
 }

 对一维数组进行堆排序

package com.test.sort;

public class TestHeapSort {

	public static void main(String[] args) {
		int[] array = {0,1,2,9,4,8,7,5};
		
		heapSort(array);
		
		for(int i=0; i<array.length; i++) {
			System.out.print(array[i] + " ");
		}
		
	}
	
	
	public static void heapSort(int[] array) {
		for(int i=array.length/2; i>=1; i--) {   //创建二叉堆(从最后一个分支节点开始,依次向上)
			shiftDown(array, i, array.length-1);
		}
		
		for(int i = array.length-1; i>=1; i--) {  
			swap(array, 1, i);				//将最大的元素与最后一个元素交换(解决最大元素放在哪里的问题)
			shiftDown(array, 1, i-1);       //整理堆,从第一个结点开始,依次向下整理,到最后一个分支结点结束
		}
		
	}
	
	public static void shiftDown(int[] array, int index, int length) {
		int child = 0;
		for(;index <= length/2; index = child) {
			child = index * 2;
			if(child<length && array[child]<array[child+1]) {
				child = child+1;
			}
			
			if(array[index]<array[child]) {
				swap(array,index,child);
			}
			
		}
		
	}
	
	public static void swap(int[] array, int index, int child) {
		int x = array[index];
		array[index] = array[child];
		array[child] = x;
	}
	
}

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】 ;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。 阅读详情

相关推荐

高德地图JS API私有化部署实战:从数据爬取到内网集成

本文详细介绍了高德地图JS API私有化部署的完整流程,涵盖从地图瓦片数据爬取、JS API离线化改造到内网项目集成的实战步骤。重点解决了在封闭内网环境中实现地图功能的核心难题,并提供了Vue.js项目中的具体集成代码与调试技巧,帮助开发者在离线环境下构建稳定可靠的地图应用。

weixin_29062255的博客 319

堆排序(C语言)

堆排序(C语言)

weixin_56223966的博客 1万+

STM32CubeMX + HAL库避坑指南:为什么你的代码总在SystemClock_Config卡住?

本文深入剖析了STM32开发者在使用STM32CubeMX和HAL库时,代码在SystemClock_Config函数中卡死的根本原因。文章不仅指出硬件时序、Flash延迟配置等常见陷阱,更提供了从硬件设计、软件容错到深度调试的系统性解决方案,帮助开发者构建鲁棒的时钟初始化策略,彻底告别启动卡顿问题。

bb456的博客 929

3.图解排序算法(三)之堆排序

作者: dreamcatcher-cx 出处: http://www.cnblogs.com/chengxiao/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。 图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排...

qq_41731051的博客 898

OneNet新版MQTT+OneJSON接入全指南

物联网云平台设备接入是嵌入式系统与云端协同的基础能力,其核心依赖于标准化通信协议与统一数据模型。MQTT作为轻量级发布/订阅协议,凭借低带宽占用和高可靠性,成为边缘设备上云的主流选择;而物模型(Thing Model)则定义了设备能力的数字契约,支撑数据语义化与平台自治管理。OneNet新版强制采用MQTT+OneJSON协议栈,不仅提升数据解析一致性与安全认证强度,更推动开发范式从‘协议适配’转向‘模型驱动’。该架构广泛适用于环境监测、智能表计、工业传感等场景,尤其利好基于ESP8266、STM32等资源

weixin_42599558的博客 362

ESP32S3学习——i2c,点亮0.96寸oled

ESP32S3学习——i2c,点亮0.96寸oled

HandBAI的博客 1万+

堆排序超详细讲解C语言

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。...

Codenange的博客 1656

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2907

堆排序详解(C语言)

二叉树中堆的应用,堆排序,时间复杂度讲解

凡事都是靠练习 2781

JAVA:Spring Boot 集成 Baidu UID-Generator ID 生成器

百度UID-Generator是一款高性能分布式ID生成器,支持600万QPS,提供Snowflake扩展版和Cache模式两种实现方式。文章详细介绍了如何在Spring Boot项目中集成该组件,包括Maven依赖配置、MySQL表结构初始化、Spring Boot数据源配置、WorkerId分配策略实现以及UID生成器的核心配置。该方案具有无中心依赖、ID单调递增、支持集群部署等特点,适用于订单号、用户ID等分布式场景。通过缓存模式(Cache-Buffer)可进一步提升性能,满足高并发业务需求。

木头 487

【100%通过率】华为od统一考试B卷【贪吃蛇】Python 实现

贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。 下面让我们来完成贪吃蛇游戏的模拟。给定一个N*M的数组arr,代表N*M个方格组成的版图,贪吃蛇每次移动一个方格。若arr[i][j] == ‘H’,表示该方格为贪吃蛇的起始位置;若arr[i][j] == ‘F’,表示该方格为食物,若arr[i][j] == ‘E’,表示该方格为空格。贪吃蛇初始长度为1,初始移动方向为向左。

MISAYAONE的博客 1205

C语言实现堆排序

要实现堆排序,首先需要了解堆排序的原理。 堆排序原理: 堆的结构类似于完全二叉树,头节点位于整个结构的最上方,每个父节点从左到右依次分岔,延申出两个子节点。 每层节点从左到右在数据中是依次排列的关系。 堆中某个结点的值总是不大于或不小于其父结点的值。 上图的每个位置分别对应一个数组的元素下标 HeapInsert:(末尾插入) 假设这个堆有序,且每个父节点的值大于等于其子节点: 假如上图是一个数组......

KamikazePilot的博客 8706

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

算法大师! 1155

堆排序详解

摘要:堆排序是一种效率非常高的排序算法,同时它的理解以及书写方式都是比较复杂的,以至于很多企业在进行面试的时候都喜欢考察堆排序的书写速度,而堆排序在项目应用中也是有着广泛的天地,因为它的高效率,使得很多数据统计场合都会有堆排序的身影。...

云杉木屋 9194

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【数据结构】堆排序的实现

堆排序详细解析!你好,欢迎光临媛仔的数据结构进阶之路~

vpurple_的博客 1603

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

排序——堆排序

在复习堆排序之前, 首先我们需要回顾一下什么是堆。堆的本质其实是一个数组。它的物理结构本质上是一个数组。但是它的逻辑结构是一棵完全二叉树。我们在判断一个数组是否是一个堆的时候根据的就是它的逻辑结构。那么怎么根据它的逻辑结构判断是否是一个堆。首先堆的逻辑结构的二叉树的每一个孩子节点都大于它的每一个父亲, 就是堆。这种堆叫做小堆。如果它的逻辑结构的每一个孩子节点都小于它的父亲节点。它同样是个堆, 同时这种堆叫做大堆。

strive_mianyang的博客 1899

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

详解堆排序

堆排序 1.堆排序基本介绍 (1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 (2) 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 (3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 (4) 大顶堆举例说明: 我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子: 大顶堆特点:arr[

xiaoshiguang3的博客 3134

堆排序之原地堆排序

之前介绍了堆排序,现在我们来聊聊原地堆排序 【代码】 //原地堆排序 template<typename T> void heapSort3(T arr[], int n) { //将数组构建成一个堆 for(int i = (n - 1) / 2; i >= 0; i--) { __shiftDown(arr, n, i); } for(int i = n - 1; i > 0; i--) { swa

qq_41033011的博客 1873

堆排序算法

一、堆排序算法基本思想 堆排序是利用堆数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 如下图所示,其中大顶堆的性质**:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]** 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆,如下图所示,其中小顶堆性质:arr[i] <=

qq_44111805的博客 7783

《堆排序》堆排序详解

堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: //大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] //小顶堆:arr[i] <= arr[2i+1] &&

Zyy~的博客 5312

堆排序每一趟的结果_堆排序

本文介绍一种神奇的排序方法——堆排序。堆排序不像插入排序和归并排序那样直观,它利用了一种称为堆的数据结构。堆堆本质上是一个数组,但我们将其当做一个近似的完全二叉树来看待。树上的每一个结点对应数组中的一个元素,按层排列。除了最底层外,该树是完全充满的,而且是从左向右填充。下图(a)为我们想象中堆的结构,而(b)则是其实际存储形式。最大堆的特点是,每一个结点都比它的两个孩子结点大(如果孩子结点存在的话...

weixin_36462094的博客 6330

堆排序每一趟的结果_八大排序-堆排序(手写堆排序)

闲聊最近看完一个电视剧,猪脚是胃无限和难忘鸡。比较奇怪的是整个电视剧没有讲爱得死去活来的男女之情反而讲的是男男之间纯纯的知己之情(基情),不过别说还挺好看。有种感觉就像:天下人负你又如何,我定然站你这边...让我想到了当今社会的一些人,这类人习惯权衡利弊后“战队”,或察言观色后随波逐流不顾真理事实。这部剧表达的三观就像一股清流,人生难得一知己,让我内心颇有触动。很喜欢胃无限说的一句话:管他熙熙攘攘...

weixin_39917437的博客 4798

【堆排序回顾】堆排序的理解

文章目录堆排序堆排序有两种方法堆排序第一种实现思路——构造堆+排序:步骤一 :构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。步骤二 :将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。堆排序过程:代码:为什么说堆排序没有快速排序快?如何理解“堆”?要实现一个堆,先要知道,堆都支持哪些操作以及如何存储一个堆。1、往堆中插入一个元素2.删除堆顶元素 堆排序 堆排序有两种方法 方法一:前提.

NothingYCX的博客 1572

堆排序的原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33923762的博客 1761
上一篇: java版 打印杨辉三角
下一篇: poj 1035
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值