堆排序简单实现

一、排序过程

二、代码实现

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

相关推荐
小江的记录本2 小时前
【TCP】TCP三次握手与四次挥手(系统性知识体系+对比表格)
java·服务器·网络·网络协议·tcp/ip·http·tcp
闻哥2 小时前
MySQL索引核心原理:B+树生成、页分裂与页合并全解析
java·jvm·b树·mysql·adb·面试·springboot
蜡台2 小时前
Android Gradle 项目下载编译失败解决---持续更新
android·java·kotlin·gradle
迈巴赫车主2 小时前
天梯赛 L2-004 这是二叉搜索树吗?java
java·开发语言·数据结构·算法·天梯赛
沐苏瑶2 小时前
Java 数据结构精讲:二叉树遍历算法与底层实现剖析
数据结构·算法
JMchen1233 小时前
跨技术栈:在Flutter/Compose中应用自定义View思想
java·经验分享·flutter·canvas·dart·自定义view
黄昏晓x3 小时前
C++11
android·java·c++
董董灿是个攻城狮3 小时前
大模型连载8:词向量如何表示近义词?
人工智能·python·算法·机器学习
Java水解3 小时前
RUST异步并发安全与内存管理的最佳实践
java·后端·面试