堆排序简单实现

一、排序过程

二、代码实现

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. 稳定性:不稳定

相关推荐
Jerry33 分钟前
LeetCode 707. 设计链表
算法
疋瓞42 分钟前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
C语言小火车1 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
kebidaixu1 小时前
两轮BMS AFE SH367306 I2C 读写时序
算法
智能排队系统_头部供应商1 小时前
RK3588边缘网关改造银行排队系统实战
算法
Fabarta1 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
手写码匠1 小时前
手写 AI 上下文压缩系统:从零实现 Prompt 压缩与选择性上下文管理
人工智能·深度学习·算法·aigc
如此这般英俊2 小时前
手搓Claude Code-第六章 subagent
数据结构·人工智能·python·语言模型·自然语言处理
EAI-Robotics2 小时前
机器人操作鲁棒性:当机械手遇上真实世界的不确定性
人工智能·算法·机器人
shushangyun_3 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习