首页 > 其他分享 >【堆排序】(大根堆)

【堆排序】(大根堆)

时间:2024-03-19 18:29:07浏览次数:22  
标签:大根堆 int 最大值 堆排序 heapify 索引 largest 节点

敬信仰赤诚,敬少年滚烫的情钟

void heapify(int a[], int n, int i)
{
   // 根据当前节点i进行堆调整,保证以i为根节点的子树符合最大堆的性质
    int largest = i; // 假设当前节点为最大值的索引
    int left = 2 * i + 1; // 计算左孩子节点索引
    int right = 2 * i + 2; // 计算右孩子节点索引

   // 如果左孩子节点存在且大于当前节点值,则更新最大值索引
    if (left < n && a[left] > a[largest])
    {
      	  largest = left;
    }
    
   // 如果右孩子节点存在且大于当前最大值节点值,则更新最大值索引
    if (right < n && a[right] > a[largest])
    {
        largest = right;
    }
    
   // 如果最大值索引不等于当前节点索引,则进行交换并递归调用heapify
    if (largest != i)
    {
        int swap = a[i];
        a[i] = a[largest];
        a[largest] = swap;
        heapify(a, n, largest);
    }
}

void heapSort(int a[])
{
    // 构建最大堆
    for (int i = n / 2 - 1; i >= 0; i--)
    {
        heapify(a, n, i);
    }
    // 逐步将最大值移到数组末尾并重新调整堆
    for (int i = n - 1; i > 0; i--)
    {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        heapify(a, i, 0); 
        // 在减小的范围内重新构建最大堆
    }
}

heapify 函数
对以数组 a 中第 i 个元素为根的子树进行堆调整,使得满足最大堆的性质。首先找到根节点、左孩子和右孩子的下标,然后比较根节点和其左右孩子的值,找出其中最大的值的下标 largest。如果根节点的值不是最大的,则将根节点与最大值所在的节点交换,并递归地对交换后的子树进行堆调整,直到整棵树满足最大堆的性质。
heapSort 函数
堆排序的主要函数。首先利用循环调用 heapify 函数,从数组的中间位置开始(提高效率),逐步向前遍历,对每个父节点进行堆调整,直到整个数组变成一个最大堆。然后通过另一个循环,将堆顶元素(当前最大值)与未排序部分的最后一个元素交换,缩小堆的范围,并再次调用 heapify 函数重新构建最大堆,最终实现对数组的升序排序。

标签:大根堆,int,最大值,堆排序,heapify,索引,largest,节点
From: https://blog.csdn.net/2301_76518242/article/details/136781891

相关文章

  • 【算法与数据结构】堆排序&&TOP-K问题之深入解析二叉树(三)
    文章目录......
  • 快排-归并-堆排序
    概述排序算法算是最经典的算法了,只要你学习算法,就永远也离不开他,常用的排序算法有:冒泡排序插入排序希尔排序桶排序计数排序计数排序快速排序归并排序堆排序这些排序大致特点如下:其中最重要,也最复杂的三种排序,分别是:快速排序归并排序堆排序一.快速排序1.大......
  • 深入浅出堆排序: 高效算法背后的原理与性能
    ......
  • Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)
    题意简述有一个以\(1\)为根的有根树,每个点有权值\(v_i\)。你需要选出一个点集\(S\),使得点集里任意两个元素\(x,y\),若\(x\)在原树上是\(y\)的祖先,则要满足\(v_x>v_y\)。求选出的点集的最大大小是多少。解法原题限制相当于:在选出的点集构成的新树\(T\)中,每个点到根节......
  • 912.排序数组--堆排序
    1.题目介绍给你一个整数数组nums,请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]2.题解2.1堆排序思路题目给了我们一个vector数组,要使用堆排序,我们首先要创建一个大根堆,再在这个大根堆的基础上对数......
  • 排序算法之堆排序
    一:概述堆排序是在二叉堆的基础上实现的,如果想要学习堆排序,就得掌握二叉堆。二叉堆的特性是:最大堆的堆顶是整个堆中最大的元素。最小堆的堆顶是整个堆中最小的元素。二:具体说明<1>以最大堆为例讲述如果要删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我......
  • 算法学习笔记六一堆排序
    目录什么是堆排序算法思想代码示例什么是堆排序堆排序(HeapSort)是一种基于二叉堆数据结构的排序算法。它的主要思想是将待排序的序列构建成一个大顶堆(或小顶堆),然后反复从堆顶取出最大(或最小)元素,将剩余的元素重新调整为一个新的堆,再重复取出堆顶元素的过程,直到排序完成。算法思......
  • 堆排序
    步骤1.将数组构建成二叉树,n的左右孩子是2n+1、2n+2.2.将二叉树转化成堆(父节点大于等于两个孩子节点(大顶堆),父节点小于等于两个孩子节点(小顶堆)),时间复杂度O(n)。3.将堆顶和最后一个元素交换(此时堆顶就是最大值),事件复杂度O(logn)。4.按需要最大的n个值来执行(n-1)次步骤3。(时......
  • 堆排序
    堆排序heapInsert&heapify排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述对一个数组进行大根堆排序算法思路heapInsert:视为用户一个个插入新数值,由下往上比较heapify:视为对所有子树排序,由子树的头结点从上往......
  • 堆结构和堆排序
    堆堆是一种特殊的完全二叉树,其他语言中的优先级队列就是堆。堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。堆的实现通常是用数组实现的,那么对于每一个节点在数组中怎么找到它的父节点和它的左右......