首页 > 其他分享 >堆结构与堆排序

堆结构与堆排序

时间:2025-01-14 10:22:56浏览次数:1  
标签:大根堆 子树 nums int 堆排序 结构 best size

测试链接:https://leetcode.cn/problems/sort-an-array/

堆结构:

是一颗完全二叉树
分为大根堆和小根堆
大根堆:每一颗子树最大值都在子树的根部
小根堆:每一颗子树最小值都在子树的根部
每一位父亲i的两个孩子的节点位置(若存在)分别为:i*2+1,i*2+2
同理每一个孩子的父亲节点位置为:(i-1)/2

堆的建立与排序:

    //建立大根堆
    //每一颗子树的根都是该子树的最大值
    void heapup(int i,vector<int>&nums)//大的数往上调整
    {
        while(((i-1)>>1)>=0&&nums[i]>nums[(i-1)>>1])
        {
            swap(nums[i],nums[(i-1)/2]);
            i=(i-1)/2;
        }   
    }
    
    void heapdown(int i,vector<int>&nums,int size)//小的数往下调整
    {
        int l=(i<<1)+1;
        while(l<size){
        int best;
        if(l+1<size)
        {
            if(nums[l+1]>nums[l])best=l+1;else best = l;
        }else{
            best=l;
        }
        if(nums[i]>=nums[best]){
            break;
        }else{
            swap(nums[i],nums[best]);
            i=best;
            l=(i<<1)+1;
        }
        }
    }

void heapsort1(vector<int>&nums)//从顶到底建立大根堆并排序
    {
        int size=nums.size();
        for(int i=0;i<size;i++)
        {
            heapup(i,nums);//先up建立大根堆
        }
        while(size>1)
        {
            swap(nums[0],nums[size-1]);
            size--;
            heapdown(0,nums,size);//后dwon进行堆排序
        }
    }

标签:大根堆,子树,nums,int,堆排序,结构,best,size
From: https://www.cnblogs.com/benscode/p/18670236

相关文章

  • Day13-【软考】长文!什么是散列表查找?以及所有的排序算法是怎样的?如何进行堆排序(重点!)?
    文章目录什么是散列表查找?计算出空间相同怎么办?排序有哪些概念?排序方法有哪些分类?什么是直接插入排序?(稳定)什么是希尔排序?什么是冒泡排序?(稳定)什么是快速排序?O(nlog2为底n为真数)什么是简单选择/直接选择排序?什么是堆排序(重点!)?O(nlog2为底n为真数)比简单的选择排序,有什么优势......
  • nvidia gpu结构简介和cuda编程入门
    0.前言最近本人在写硕士大论文,需要写一些GPU相关的内容作为引言,所以在此总结一下。1.NVIDIAGPU线程管理CUDA的线程模型如上图,在调用一个CUDA函数时,需要定义grid和block的形状:func<<<grid,block>>>();在程序里定义的grid和block都是dim3类型的变量。当调用一个函数时,该函......
  • Java-数据结构-栈与队列(常考面试题与单调栈)
    在上一篇的学习中,我们学习了栈和队列的基本知识,以及它们对应都有哪些方法,在什么应用场景下如何使用,并且还对它们进行了模拟实现,而其实对于栈和队列的相关知识还远不止于此,而今天我们就对栈与队列进行复盘,认识更多使用它们的场景,夯实代码功底吧~一、常考面试题-思维以下习题在......
  • C语言-循环结构
    循环结构:重复执行代码1、for循环    循环用于在知道循环次数的情况下使用。三个部分:初始化、条件判断和更新    基本形式:                    嵌套循环:                2、while循环        循环在......
  • Java算法 数据结构 栈 队列 优先队列 比较器
    目录栈Stack性质构造方法代码示例队列Queue性质构造方法代码示例优先队列PriorityQueue性质构造方法代码示例比较器1.Comparator接口的方法2.常见的内置比较器1.自然排序比较器(naturalOrder())2.逆序排序比较器(reverseOrder())3.nullsFirst()......
  • 《零基础Go语言算法实战》【题目 2-18】获取结构体中字段的 tag 值
    《零基础Go语言算法实战》【题目2-18】获取结构体中字段的tag值在Go语言中,使用json包时,在结构体中的字段前会加上tag,有没有什么办法可以获取到这个tag的内容呢?举例说明。【解答】tag信息可以通过reflect包内的方法获取,下面通过一个例子来加深理解:packagema......
  • 螺栓连接结构的优化设计方法
    1.结构优化设计简介在满足结构受力的前提下,使结构质量降低,对于工程设计具有重要意义。如桥梁自重的降低可以大幅提高其跨越能力;航天器质量的降低,可以提高飞行速度。结构的轻量化设计是土木工程、航天工程等结构物设计的重要内容。结构优化设计是一种寻找确定最优化设计方案的......
  • 高温下螺栓连接结构的计算
    1.热应力计算原理工程中的许多结构在高温条件下工作或由于工作过程中运动副的摩擦发热,都会导致结构产生温度升高,产生热变形或温度应力,因此,减少或控制热变形/温度应力是设计中不可忽视的问题。工程设计中,常期望准确地计算出结构各个部位的温升或热变形量,分析结构的热平衡状况,......
  • 数据结构(霍夫曼树)
    1.Huffman编码1.1问题起源假设在数据通信中,有一字串"ABABBCBBA"需要传送,一般会将这些字符进行编码,然后按编码后的二进制位进行传输,例如这些字母的ASCII码取值为:A(65):01000001B(66):01000010C(67):01000011因此最“简单”的方式,就是将上述字串直接使用字符......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(二)
    1.用队列实现栈。习题链接https://leetcode.cn/problems/implement-stack-using-queues/description/描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:voidpush(intx) 将元素x压入栈顶。int......