堆排序简单实现

一、排序过程

二、代码实现

java 复制代码
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void HeapSort(int[] arr) {
        createHeap(arr);
        int end = arr.length - 1;
        while(end > 0) {
            swap(arr,0,end);//把堆顶与最后一个数进行交换,此时end为最大的数
            siftDown(arr,0,end);//再次进行向下调整,但不包括end
            end--;
        }
    }
    private static void createHeap(int[] arr) {
        //从后往前建堆,保证每个树都是大根堆
        for(int parent = arr.length/2 - 1; parent >= 0; parent--) {
            siftDown(arr,parent,arr.length);
        }
    }

    private static void siftDown(int[] arr, int parent, int length) {
        int child = parent * 2 + 1;
        while(child < length) {
            //判断左右子树的大小,若右子树大于左子树,更新child,保证child是最大的孩子
            if(child + 1 < length && arr[child] < arr[child+1]) {
                child++;
            }
            //与父亲进行比较,若父亲大于孩子,直接跳出循环,否则进行交换
            if(arr[parent] >= arr[child]) {
                break;
            }else{
                swap(arr,parent,child);
                parent = child;
                child = parent * 2 + 1;
            }
        }
    }

三、特性

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

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

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

  4. 稳定性:不稳定

相关推荐
kiracrimson27 分钟前
string 容器:从 C 字符串到会自己扩容的类
开发语言·数据结构·c++·stl
code2cat32 分钟前
【随笔】RAG检索缓存:复用证据之前,先把权限和版本放进缓存键
java·人工智能·缓存·知识库·rag
一条闲鱼_mytube38 分钟前
分布式 ID 生成方案:雪花算法与号段模式
分布式·算法·wpf
Msir_Modern44 分钟前
Noita 元胞沙盒笔记
算法·unity·c#·游戏引擎·元胞自动机
\光辉岁月/1 小时前
2.spring5-IOC
java·容器·ioc·注解
java_nnnn1 小时前
Spring MVC小案例(1)
java·后端·spring·mvc
西凉的悲伤1 小时前
Spring Boot 条件装配注解详解
java·springboot·1024程序员节·条件装配
木井巳2 小时前
【动态规划: 路径问题】不同路径
java·算法·leetcode·动态规划
打工仔折腾 AI2 小时前
AI Agent 工程化实战(二):5 分钟跑通 Deep Agent 并逐层拆解底层链路
java·数据库·人工智能·后端·python·langchain·ai agent 实战
秋名RG2 小时前
(二)存储、CPU 与指令执行——程序为什么快,又为什么慢
java·开发语言