堆排序简单实现

一、排序过程

二、代码实现

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

相关推荐
Mahir085 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
RyFit6 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码6 小时前
C++ 内存分区 堆区
java·开发语言·c++
心中有国也有家6 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
绝知此事7 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海7 小时前
C# 隐式转换深度解析
java·开发语言·c#
碧海银沙音频科技研究院7 小时前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别
一只大袋鼠7 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
csdn_aspnet7 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展