排序算法-堆排序

思路

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆 来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

我们先将要排序的数据建成堆,然后通过下图所示的步骤进行排序

特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。

  2. 时间复杂度:O(N*logN)

  3. 空间复杂度:O(1)

  4. 稳定性:不稳定

代码及注释

java 复制代码
public class HeapSort {
    public static void heapSort(int[]arr){
        //先将数组中的数据创建成堆
        //由于要进行升序排序,所以要创建大根堆
        createBigHeap(arr);
        //此时数组中的数据已经是大根堆了
        //由于大根堆堆顶的数是最大的,所以可以将堆顶的数换到数组最后,然后再将其余的数据转换为大根堆,继续同样的操作
        int length=arr.length;
        for(int i=1;i<length;i++){
            int end=length-i;
            swap(arr,0,end);
            siftDown(arr,0,end);
        }
    }

    private static void createBigHeap(int[]arr){
        //要对拥有子树的节点进行向下调整
        int length=arr.length;
        //遍历所有拥有子树的节点
        for(int i=(length-1-1)/2;i>=0;i--){
            //对父节点向下调整(用两个子树的最大值与父节点的值进行比较,如果父节点小,则交换父节点与子节点)
            siftDown(arr,i,length);
        }
    }
    //向下调整
    //调整根节点parent所在的树,使成为大根堆
    private static void siftDown(int[]arr,int parent,int end){
        //获得父节点parent左子树的下标child
        int child=parent*2+1;
        //child没有超过范围,表示当前的parent确实是父节点
        while (child<end){
            //子节点和父节点交换有以下3种情况
            //1.没有右孩子,此时就比较左孩子与父节点的大小,左孩子大,就交换
            //2.有右孩子,此时比较左孩子与右孩子的大小,要是左孩子大,就比较左孩子与父节点的大小,还是左孩子大,就交换
            //3.有右孩子,此时比较左孩子与右孩子的大小,要是右孩子大,就比较右孩子与父节点的大小,还是右孩子大,就交换
            //判断child此时应该指向左孩子还是右孩子,child一开始指向的是左孩子,经过判断后,child会指向比较大的那个孩子
            if(child+1<end&&arr[child]<arr[child+1]){
                child=child+1;
            }
            //判断比较大的子孩子与父节点之间的大小关系
            if(arr[child]>arr[parent]){
                swap(arr,child,parent);
            }

            //可能交换后对于下一层的树还是不合适,就还要继续进行向下调整
            parent=child;
            child=parent*2+1;
        }
    }

    public static void swap(int[] arr,int m,int n) {
        int tmp=arr[m];
        arr[m]=arr[n];
        arr[n]=tmp;
    }
}
相关推荐
喵本喵叁肆9 分钟前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
.痞老板.37 分钟前
java ee--计算机是如何工作的
java·开发语言·java-ee
青梅味猪大肠1 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
CoderYanger1 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
程序员沉梦听雨1 小时前
【搜索引擎】Kibana使用指南
java·后端·学习笔记
奶油话梅糖2 小时前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
vipxieliang2 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
Rain的Java大神之路2 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
golang学习记3 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力3 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python