`

堆排序(Heap Sort)

 
阅读更多

堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序的平均时间复杂度为O(nlogn)空间复杂度为O(1)。堆排序是不稳定的。

 1.小根堆和大根堆

堆有小根堆和大根堆两种,如下图所示:

heap sort

 

2.堆的存储

堆积树是一个近似完全二叉树的结构,通常用一维数组来实现在完全二叉树中双亲结点和孩子结点之间存在如下关系:

  • 父节点i的左子节点在位置 (2*i);
  • 父节点i的右子节点在位置 (2*i+1);
  • 子节点i的父节点在位置 floor(i/2)。
  • 3.用大根堆排序的基本思想

    ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区;
    ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key;
    ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
    ……
    直到无序区只有一个元素为止。

    4.代码实现

     

    public class HeapSort {
    	
    	private static int left(int i){
    		return 2*i;
    	}
    	
    	private static int right(int i){
    		return 2*i + 1;
    	}
    	
    	public static void maxHeapify(int[] data, int i, int heapSize){
    		
    		int l = left(i);
    		int r = right(i);
    		int largest;
    		
    		if(l < heapSize && data[l] > data[i]){
    			largest = l;
    		}else{
    			largest = i;
    		}
    		
    		if(r < heapSize && data[r] > data[largest]){
    			largest = r;
    		}
    		
    		if(largest != i){
    			swap(data,i,largest);
    			maxHeapify(data, largest, heapSize);
    		}
    	}
    	
    	public static void buildMaxHeap(int[] data){
    		int heapSize = data.length;
    		
    		for(int i = heapSize/2; i >= 0; i--){
    			maxHeapify(data, i, heapSize);
    		}
    	}
    	
    	public static void heapSort(int[] data){
    		int heapSize = data.length;
    		
    		buildMaxHeap(data);
    		for(int i = heapSize - 1; i > 0; i--){
    			swap(data,0,i);
    			heapSize = heapSize - 1;
    			maxHeapify(data, 0, heapSize);
    		}
    	}
    	
    	public static void swap(int[] data, int i, int j) {
    		int temp = data[i];
    		data[i] = data[j];
    		data[j] = temp;
    	}
    	
    	public static void main(String[] args) {
    		int[] number = {49,38,65,97,76,13,27,49};
    		
    		heapSort(number);
    		for(int i = 0; i < number.length; i++) {
    			System.out.print(number[i] + " ");
    		}
    	}
    }
    

     

     5.补充

    • 堆在调整的过程中,就是一个选择的行为,每次将最大值选至树根,而选择的路径并不是所有的元素,而是由树根至树叶的路径,因而可以加快选择的过程,所以Heap排序法才会被称之为改良的选择排序法。
    • 堆可用来实现优先级队列,或者说堆就是一种优先级队列。优先级队列是这样的一种数据结构,对它的访问或者删除操作只能对集合中通过指定优先级方法得出的最高优先级元素进行。 
    0
    9
    分享到:
    评论

    相关推荐

      数据库实验.py

      数据库实验.py

      机器学习技术对心电图 (ECG) 信号进行分类matlab代码.zip

      1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

      学会学习心理课拒绝诱惑:自制力培养手册.docx

      学会学习心理课拒绝诱惑:自制力培养手册.docx

      基于matlab+Simulink模拟的微电网系统包括包括电源、电力电子设备等+源码+开发文档(毕业设计&课程设计&项目开发)

      基于matlab+Simulink模拟的微电网系统包括包括电源、电力电子设备等+源码+开发文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 这是一个完整的微电网模型,包括电源、电力电子设备、使用MatLab和Simulink的负载和电源模型。该模型基于费萨尔·穆罕默德的硕士论文《微网格建模与仿真》。 什么是微电网 模拟的微电网使用一组电源和负载在与任何集中式电网(宏电网)断开连接的情况下工作,并自主运行,为其局部区域提供电力。该仿真对微电网在稳态下进行建模,以分析其对输入变化的瞬态响应。 此模拟的目的 对系统进行全年模拟,测量负载、产量、电压和频率。 给出简化规划和资源评估阶段的方法。

      Translucent Image - Fast Blurred Background UI v4.4.1

      Unity插件 Translucent Image 可帮助你构建精美的模糊背景 UI,例如在 iOS/MacOS/Windows 10 Fluent 设计中的 UI。 与许多其他背景模糊解决方案不同,Translucent Image 采用一种对性能影响最小的高效算法,因此用户可以享受更高的帧速率和更长的电池寿命。不仅如此,当你将模糊调高时,它还可以产生完美的平滑效果,而其它资源在高度模糊时会呈现难看的块状图像。

      基于卷积神经网络的人脸识别(包括数据集)

      基于卷积神经网络的人脸识别卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均

      基于java进行的软件测试实验代码.zip

      基于java进行的软件测试实验代码.zip

      【优化求解】遗传算法求解多城市多应急物流中心选址问题【含Matlab源码 1724期】.zip

      【优化求解】遗传算法求解多城市多应急物流中心选址问题【含Matlab源码 1724期】.zip

      结构型设计模式(7种)

      结构型设计模式(7种)

      课设毕设基于SpringBoot+Vue的旧物置换网站 LW+PPT+源码可运行.zip

      课设毕设基于SpringBoot+Vue的旧物置换网站 LW+PPT+源码可运行.zip

      微信小程序源码 健康饮食助手 健康菜谱app 下载

      健康菜谱App是一款专为追求健康饮食生活的用户设计的应用程序。它提供了一系列精心挑选的营养食谱,旨在帮助用户做出美味又健康的餐点。以下是健康菜谱App的核心特点: 丰富食谱库:包含数百种健康食谱,涵盖早餐、午餐、晚餐及小吃等。 营养信息标注:每道食谱都配有详细的营养信息,包括卡路里、蛋白质等。 个性化推荐:根据用户的饮食习惯和健康目标,智能推荐合适的菜谱。 食材替换建议:提供食材替换选项,帮助用户根据自己的口味和需求调整食谱。 一键购物清单:自动生成购物清单,方便用户购买所需食材。 步骤图解:每道食谱都配有清晰的步骤图解,即使是烹饪新手也能轻松上手。 社区分享功能:用户可以在社区中分享自己的烹饪成果,交流烹饪心得。 无广告干扰:提供无广告的用户体验,让用户专注于烹饪和享受美食。 健康菜谱App是健康饮食追求者的得力助手,无论是健身爱好者、素食主义者还是普通家庭,都能找到适合自己的健康食谱。立即下载健康菜谱App,开启健康饮食新篇章!

      课设毕设基于SpringBoot+Vue的职称评审管理系统 LW+PPT+源码可运行.zip

      课设毕设基于SpringBoot+Vue的职称评审管理系统 LW+PPT+源码可运行.zip

      MikelProjectDemo-dev.zip

      MikelProjectDemo-dev

      基于 SpringBoot 开发的超简洁音乐播放器.zip

      基于springboot的java毕业&课程设计

      HUWEI eNSP课程作业

      HUWEI eNSP课程作业

      基于SpringBoot、SSH和Redis的NBA论坛网站.zip

      基于springboot的java毕业&课程设计

      基于SpringBoot的Java旅游APP.zip

      基于springboot的java毕业&课程设计

      微信小程序设计-教育培训.rar

      微信小程序设计之相关行业源码及图文导入教程

      Unity完整小游戏-贪吃蛇(Unity 2D实现版)

      在 Unity 中创建一个简单的“贪吃蛇”游戏是一个很好的练习项目,可以帮助理解 Unity 的基本组件和工作流程。要在Unity中实现一个完整的2D贪吃蛇游戏,需要遵循一系列步骤来创建游戏场景、角色、食物、游戏逻辑和用户界面。

      基于SpringBoot + Vue的电影售票及影院管理系统.zip

      基于springboot的java毕业&课程设计

    Global site tag (gtag.js) - Google Analytics