首页 > 其他分享 >912.排序数组--堆排序

912.排序数组--堆排序

时间:2024-01-19 16:45:51浏览次数:27  
标签:大根堆 nums -- 堆排序 len large int 节点 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.利用好完全二叉树的性质,对于一个序号为i的节点,其父节点为 i/2, 左子结点为 2i, 右子节点为 2i+1, 但注意!!!这只是针对索引从1开始的情况
这里我们数组索引从0开始,父节点为 i/2, 左子结点为 2i+1, 右子节点为 2i+2;
对应int lson = (i << 1) + 1, rson = (i << 1) + 2;

2.创建大根堆采用自下而上的方式(有点类似递归的思想),先将节点i的左右子树都建立为大根堆,也就是两边子树最大的值刚好为节点i的左右子节点,再来跟节点i进行判断,将其中大的换上来或者保留原值即可。

3.创建大根堆时,选择从len/2开始?这是因为叶子结点在创建大根堆时先行跳过,直接从叶子结点上一层开始进行调整(叶子结点无左右子节点,无法比较)
对应for(int i = len / 2; i >= 0; i--){...}

4.注意当第一次判断中左子结点不存在或者小于根节点时,large = i;

5.注意:这里 i = large; 配合 for(; (i << 1) + 1 <= len;){} 使得当完成一次节点交换后,我们重新构建子大根堆。因为我们将较小值换到子节点,可能破坏下方的大根堆,所以需要检查!!!
if (large != i){ swap(nums[i], nums[large]); i = large; }

二.堆排序
每次将大根堆的根节点,也就是最上方的节点换到最后一个节点固定,这样最后一个最大数便已经确定
之后再调整剩余元素的大根堆,再将调整后的根节点换到倒数第二个节点固定,依次这样进行,每次将最大的节点换到待排序数组末尾即可。

代码

class Solution {
    /* 调整以i为根节点的大根堆 */
    void maxHeapify(vector<int>&nums, int i, int len){
        for(; (i << 1) + 1 <= len;){
            int lson = (i << 1) + 1, rson = (i << 1) + 2;
            int large;
            if (lson <= len && nums[lson] > nums[i]) large = lson;
            else large = i;
            if (rson <= len && nums[rson] > nums[large]) large = rson;
            if (large != i){
                swap(nums[i], nums[large]);
                i = large;
            }
            else break;
        }
    }

    /* 创建大根堆,自下向上 */
    void buildMaxHeap(vector<int>&nums, int len){
        for(int i = len / 2; i >= 0; i--){
            maxHeapify(nums, i, len);
        }
    }

    /* 大根堆排序*/
    void heapSort(vector<int>&nums){
        int len = (int)nums.size() - 1;
        buildMaxHeap(nums, len);
        for(int i = len; i >= 1; i--){
            swap(nums[0], nums[i]);
            len--;
            maxHeapify(nums, 0, len);
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        heapSort(nums);
        return nums;
    }
};

标签:大根堆,nums,--,堆排序,len,large,int,节点,912
From: https://www.cnblogs.com/trmbh12/p/17975017

相关文章

  • 创建隧道和删除隧道
    一、在linux机器上创建隧道172.36.11.154能访问 172.36.11.153:22端口 ,172.36.11.154不能直接访问10.209.22.101:8157  则 172.36.11.154:18154-----》(172.36.11.153:22)---------》10.209.22.101:8157 1.在172.36.11.154上执行  ssh-CfNg-L18154:10.209.22.101......
  • 定期监控是否存在之前的挖矿程序,并完成清理
    (1)编写一个脚本vi clean_host.sh  #!/bin/bashpid_cpu=`psaux|grep-vPID|sort-nr-k3|head-n1|awk'{print$2,$3,$11}'`pid=`echo$pid_cpu|awk'{print$1}'`cpu=`echo$pid_cpu|awk'{print$2}'`cmd=`echo$pid_cpu|awk'......
  • Rust 错误处理
    目录用panic!处理不可恢复的错误对应panic时的栈展开或终止使用panic!的backtraceWindows设置RUST_BACKTRACE环境变量的两种方式用Result处理可恢复的错误匹配不同的错误不同于使用match和Result<T,E>失败时panic的简写:unwrap和expect传播错误传播错误的简写:?......
  • Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
    ApachePOI、EasyPoi、EasyExcel都是与处理MicrosoftOffice格式文件相关的Java库,但它们有一些区别。下面是它们的主要特点和区别:ApachePOI:特点:ApachePOI是一个开源的Java库,用于处理MicrosoftOffice格式文件,如Excel、Word、PowerPoint等。它提供了丰富的API,......
  • vibora 经验
    pipinstallviboratortoise-ormfromtortoiseimportfields,modelsfromtortoise.contrib.pydanticimportpydantic_model_creatorclassUser(models.Model):id=fields.IntField(pk=True)username=fields.CharField(max_length=2......
  • windows 设置定时任务 - schtasks
    主要参考此blog: https://blog.csdn.net/rimke/article/details/133740041命令:schtasks/create/SCdaily/ST16:02/TNdailyBreakingNews/TRC:\Users\Administrator.DESKTOP-S92EN3R\Desktop\dailyBreakingNews.exe 在cmd中执行完成此命令后,可以在任务计划程序中......
  • 【测试自动化覆盖率】记录统计自动化的工具testrail 如何实现自动统计覆盖率
        点击编辑来到这个页面 点击自己想要统计的testplan里面的用例选择selectcases   先选择右边的过滤所有Automated 为yes的tag,然后在底下点击确定 在左边呈现的就是出现的  取消不要的用例  ......
  • 单机变频器简单启停电路
        西门子参数默认 仅供参考......
  • 商丘师范大学 数学与统计学院
    数学与统计学院现设有数学与应用数学、统计学、金融数学三个本科专业。目前在校生1300多人。一、数学与应用数学(国家级特色专业,师范类,四年制本科)本专业旨在培养掌握数学科学的基本理论与基本方法,具备运用数学知识、使用计算机解决实际问题的能力,受到科学研究的初步训练,能在科......
  • 2-STM32F103+EC800K(移远4G Cat1)远程升级篇(阿里云物联网平台)-STM32F103使用EC800K
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/EC800K/aliyunota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  ......