堆排序简单实现

一、排序过程

二、代码实现

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

相关推荐
vx_Biye_Design4 分钟前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
吴声子夜歌5 分钟前
Nginx应用与运维——Nginx日志管理
java·运维·nginx
guo_wen_qiang23 分钟前
云服务器nacos搭建-集群&持久化
java·运维·服务器
50万马克的面包43 分钟前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表
All for pursuit.1 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青1 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq1 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq1 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
江江爱编程1 小时前
java零基础保姆级教学01
java·开发语言