排序算法——堆排序

什么是堆

堆就是一种特殊的二叉树,他有以下特点:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;

  • 堆总是一棵完全二叉树。

堆又可以分为大根堆和小根堆

大根堆:根节点最大,每个节点都小于或等于父节点

小跟堆:根节点最小,每个节点都大于或等于父节点

堆的建立思想

以大根堆为例,每一个节点都当作是一个大根堆,我们通过维护每一个节点的堆结构进而将整个二叉树变成堆。由于叶子节点没有子节点,所有不需要对他维护。

代码实现

java 复制代码
//这里用数组来代替堆结构    
public void buildMapHeap(int []heap,int heapSize){
        //遍历没一个非叶子节点
        for(int i=(heapSize)/2-1;i>=0;i--){
            maxHeapify(heap,i,heapSize);
        }
    }

    public void maxHeapify(int []heap,int i,int heapSize){
        //左孩子索引
        int l=2*i+1;
        int r=2*i+2;
        //假设最大值的索引是父节点
        int maxVlue=i;
        if(l<heapSize&&heap[l]>heap[maxVlue]){ //(叶子节点不需要调整)&&()
            maxVlue=l;
        }
        if(r<heapSize&&heap[r]>heap[maxVlue]){ //(叶子节点不需要调整)&&()
            maxVlue=r;
        }
        if(maxVlue!=i){
            //交换让父节点值最大
            swap(heap,i,maxVlue);
            //由于调整的堆结构可能导致原来的子节点的堆结构发生改变
            //所有也要调整原来子节点的堆结构
            maxHeapify(heap,maxVlue,heapSize);
        }
    }
    public void swap(int heap[],int i,int j){
        int t=heap[i];
        heap[i]=heap[j];
        heap[j]=t;
    }

小根堆代码实现类似不在赘述 大家可以自己实现。

建立好大根堆后,堆顶就是数组里面最大的元素,如果要实现堆排序只需要每次移除这个堆顶元素,然后将堆尾元素替换,再重新以堆顶进行调整。

相关推荐
Q741_1476 小时前
C++ 分治 快速选择算法 堆排序 TopK问题 力扣 215. 数组中的第K个最大元素 题解 每日一题
c++·算法·leetcode·分治·1024程序员节·topk问题·快速选择算法
文火冰糖的硅基工坊6 小时前
[人工智能-大模型-57]:模型层技术 - 软件开发的不同层面(如底层系统、中间件、应用层等),算法的类型、设计目标和实现方式存在显著差异。
人工智能·算法·中间件
鱼儿也有烦恼7 小时前
快速学完 LeetCode top 1~50 [特殊字符]
java·算法·leetcode·1024程序员节
独自破碎E7 小时前
LeetCode 380: O(1) 时间插入、删除和获取随机元素
java·算法·leetcode
Brookty7 小时前
【算法】前缀和(二)使用
java·学习·算法·前缀和·动态规划·1024程序员节
不良人龍木木7 小时前
云图-地基云图
图像处理·算法·计算机视觉·1024程序员节
RTC老炮7 小时前
webrtc弱网-PccNetworkController类源码分析与算法原理
网络·算法·webrtc
Swift社区7 小时前
LeetCode 406 - 根据身高重建队列
算法·leetcode·1024程序员节
敲上瘾7 小时前
背包dp——动态规划
c++·算法·动态规划
京东零售技术7 小时前
大模型时代的广告营销变革与实践
算法