首页 > 其他分享 >堆排序

堆排序

时间:2023-11-19 10:03:32浏览次数:23  
标签:排序 复杂度 堆排序 二叉树 nlogn 节点

堆是一种特殊的树形数据结构,它满足以下两个性质:

  1. 完全二叉树:堆是一棵完全二叉树,即除了最底层之外,其他每一层的节点都被完全填满,且最底层的节点都尽可能地集中在左侧。
  2. 堆属性:对于最大堆(大顶堆)来说,父节点的值总是大于或等于任何一个子节点的值;对于最小堆(小顶堆)来说,父节点的值总是小于或等于任何一个子节点的值。

堆排序是一种利用堆这种数据结构来进行排序的算法。它的基本思想是先将待排序的数组构造成一个最大堆(或最小堆),然后依次将堆顶元素(最大值或最小值)取出,再对剩余的元素重新构造堆,如此往复直至完成排序。

堆排序的具体步骤如下:

  1. 构建堆:将待排序的数组看成是一个完全二叉树的结构,从最后一个非叶子节点开始(索引为n/2-1),自底向上地调整,使得每个父节点的值都大于其子节点的值(最大堆)或小于其子节点的值(最小堆)。
  2. 排序:将堆顶元素(最大值或最小值)与数组末尾元素交换,然后将剩余部分重新调整为堆,再次取出堆顶元素,如此往复直至完成排序。

堆排序的时间复杂度为O(nlogn),其中n为待排序数组的长度。虽然堆排序在最坏情况下和平均情况下的时间复杂度都为O(nlogn),但由于其数据访问方式的局部性,它通常比快速排序慢,因此在实际应用中并不常用于普通数据排序,但是在一些特定场景下仍然具有一定的价值。

总的来说,堆排序是利用堆这种数据结构来进行排序的一种高效算法,通过构建堆和反复调整堆的过程来完成排序,其时间复杂度为O(nlogn),是一种稳定且适用于大规模数据排序的算法。

标签:排序,复杂度,堆排序,二叉树,nlogn,节点
From: https://blog.51cto.com/u_16161880/8469624

相关文章

  • 堆以及堆的应用--堆排序
    堆定义:什么是堆?从堆的定义上我们可以看出,堆在物理结构上是一维数组,逻辑结构上,可以把堆理解为一棵完全二叉树,因为堆满足ki<=k2i+1,ki<=k2i+2(ki>=k2i+1,ki>=k2i+2),而我们了解对于完全二叉树,父结点和孩子结点存储在一维数组中有如下的下标关系:leftchild=parent*2+1rightchild=parent*2......
  • 在思想方面讨论堆排序(考研自用,按非递减方式排序)
     目录1.什么是排序2.关于堆排序的几个问题3.问题求解首先:排序的定义  拿冒泡排序(递增)来讲,在一个给定的数组序列中,若A[i+1]<A[i],则将其两个的数值进行交换,排好序的序列应该是递增的,类似于[1,2,3,4,5...];所以排序是在数组中进行的,物理......
  • 09-堆排序
    9.堆排序9.1完全二叉树在满二叉树路上的树。如果二叉树是完全二叉树,并且用数组表示,则:位置i的左右孩子节点为2i+1和2i+2位置i的父节点为(i-1)/29.2堆堆是完全二叉树堆有大根小根之分他的每颗子树都必须满足大根/小根堆9.3堆排序1.题目​ 堆排序......
  • 最大堆最小堆及堆排序
    堆这个数据结构在我大学的教材上没有讲解,但平时听说过堆排序什么的,无疑是要用到这个数据结构,所以本篇文章主要是总结下堆的概念和实现。堆概念在维基百科中,是这样定义堆的:堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点P......
  • 堆排序
    时间复杂度为O(n)voidheapify(vector<int>&nums,intn,inti){intlargest=i;//假设为父节点intlson=i*2+1;intrson=i*2+2;//找到最大值if(lson<n&&nums[lson]>nums[largest])swap(nums[lson],nums[largest]);if(rson<......
  • 深入了解堆排序算法
    堆排序(HeapSort)是一种高效的、基于堆数据结构的排序算法,它具有稳定性和可预测的性能,适用于各种数据规模。本文将详细介绍堆排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。堆排序的基本思想堆排序的核心思想是通过构建一个二叉堆,将待排序的数组转换为一个堆,然后反......
  • 并查集 堆排序 (9/10)
    并查集模板 注意查找到后查找的节点直接连接根节点#include<iostream>usingnamespacestd;constintN=100010;intp[N];//关键记住find函数intfind(inta){if(p[a]!=a)p[a]=find(p[a]);//不等于根节点就往头结点走,并且等于returnp[a];}intma......
  • Java 堆排序
    思路从最后的非叶子节点开始,从后向前构建一个堆(大顶堆/小顶堆);即最后的非叶子节点和其下的叶子节点构成一个大顶堆,然后再找前面一个非叶子节点继续此时根节点是最大的数据,然后将根节点和最后一位进行交换交换后,排除最后一位最大值,再从根节点开始构建大顶堆重复2,3步骤代码......
  • c++ 堆排序
    堆排序主要分为两个函数:1、构建堆2、元素调整#include<iostream>usingnamespacestd;voidmaxHeap(inttree[],intn,inti){ if(i>=n) return; intlchild=i*2+1; intrchild=i*2+2; intmax=i; if(lchild<n&&tree[lchild]>t......
  • 堆排序 桶排序 基数排序
    堆排序使用数组和表示堆大小的整数heapSize表示堆:vector<int>arr{9,5,3,7,2};intheapSize=5;heapSize=5表示数组从索引0开始的5个元素表示一个堆。堆结构就是用数组实现的完全二叉树结构。求数组中索引i位置节点的父子节点:父节点:(i-1)/2左子节点:2*i+1右子节......