数据结构经典算法之五 堆排序

堆排序是一种减治算法,通过建立大堆或小堆寻找最值。过程包括向下调整、建堆和堆排序三个步骤。在向下调整中,确保每个节点值大于等于其子节点;建堆是从最后一个非叶子节点开始,逐个向下调整;堆排序则通过选择最大值移到末尾来逐步排序。堆排序的时间复杂度为O(n*log(n)),空间复杂度为O(1),但不是稳定的排序算法。
摘要由CSDN通过智能技术生成
堆排序

基本思想:减治算法。通过堆来选择数据,其中排升序建大堆,排降序建小堆

首先,在这里简单介绍一下二叉堆的概念:二叉堆在逻辑上可视为完全二叉树,在物理上可视为数组,本质上是对于任意一个结点,要求根的值 >=(针对大堆) 所有的子树结点的值,其基本作用是找最值

堆排序主要分为以下三部分:
1.向下调整
  • 前提:只有一个位置可能不满足堆的性质,其余位置都已经满足堆的性质
  • 1.判断要调整的结点是否为叶子结点(左子树的下标如果越界,就是叶子)
  • 2.找最大的孩子(没有右子树,最大孩子就是左孩子;否则,比较左右孩子并且选出最大的孩子)
  • 3.比较双亲的值和最大孩子的值,如果双亲大,停止;否则交换两者的值,并以新结点开始继续向下调整
2.建堆
  • 对整棵树建堆,需要左右子树已经是堆,对根结点向下调整
  • 从最后一个非叶子结点一直到0,不断向下调整
3.堆排序
  • 1.建好一个大堆
  • 2.采用减治算法,每次选择一个无序部分最大数交换到无序部分的最后面

代码实现:

1.建堆

void createHeap(int[] array){
   
    //1.堆整棵树建堆,需要左右子树已经是堆,对根结点向下调整
    //2.从最后一个非叶子结点一直到0,不断向下调整
    for(int i = (array.length - 2 ) / 2; i >= 0; i--){
   
        heapify(array , array.length , i);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值