Java 十大排序算法之堆排序刨析

 更新时间:2021年11月24日 09:25:22   作者:龍弟-idea  
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构

二叉堆是完全二叉树或者是近似完全二叉树。
二叉堆满足二个特性︰

1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。

2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。

任意节点的值都大于其子节点的值——大顶堆(最后输出从小到大排)
任意节点的值都小于其子节点的值———小顶堆(最后输出从大到小排)

堆排序步骤

1.堆化,反向调整使得每个子树都是大顶或者小顶堆(建堆)
2.按序输出元素∶把堆顶和最末元素对调,然后调整堆顶元素(排序)

堆排序代码实现(大顶堆)

public class HeapSort {
    private static void heapSort(int[] arr) {
        // 构造初始堆(大顶堆),从第一个非叶子节点开始调整,左右孩子节点中较大的交换到父节点中
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            heapAdjust(arr, i, arr.length);
        }
        // 调整堆结构,交换堆顶元素与末尾元素
        for (int j = arr.length - 1; j > 0; j--) {
            swap(arr, 0, j);// 将堆顶元素与末尾元素进行交换
            heapAdjust(arr, 0, j);// 重新对堆进行调整
        }
    }
 
    private static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
 
    // 调整大顶堆
    private static void heapAdjust(int[] arr, int i, int len) {
        int temp = arr[i], index = 2 * i + 1;
        while (index < len) {
            if (index + 1 < len && arr[index] < arr[index + 1]) {// 如果左子结点小于右子结点,index指向右子结点
                index += 1;
            }
            if (arr[index] > temp) {// 如果子节点大于父节点,将子节点值赋给父节点
                arr[i] = arr[index];
                i = index;
                index = 2 * i + 1;
            } else {
                break;
            }
        }
        arr[i] = temp;
    }
 
    public static void main(String[] args) {
        int[] arr = {1,28,3,21,11,7,6,18};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

时间复杂度:O(nlogN)

到此这篇关于Java 十大排序算法之堆排序刨析的文章就介绍到这了,更多相关Java 堆排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java利用SMB读取远程文件的方法

    java利用SMB读取远程文件的方法

    这篇文章主要为大家详细介绍了java利用SMB读取远程文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 解决SpringBoot整合MybatisPlus分模块管理遇到的bug

    解决SpringBoot整合MybatisPlus分模块管理遇到的bug

    这篇文章主要介绍了解决SpringBoot整合MybatisPlus分模块管理遇到的bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Windows下如何安装配置Redis环境

    Windows下如何安装配置Redis环境

    这篇文章主要介绍了Windows下如何安装配置Redis环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 基于FlashPaper实现JSP在线阅读代码示例

    基于FlashPaper实现JSP在线阅读代码示例

    这篇文章主要介绍了基于FlashPaper实现JSP在线阅读代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • jsp+servlet实现简单登录页面功能(附demo)

    jsp+servlet实现简单登录页面功能(附demo)

    本文主要介绍了jsp+servlet实现简单登录页面功能登录成功跳转新页面,登录失败在原登录界面提示登录失败信息,对初学者有一定的帮助,感兴趣的可以了解一下
    2021-07-07
  • java中关于return返回值的用法详解

    java中关于return返回值的用法详解

    在本篇文章里小编给大家整理的是一篇关于java中关于return返回值的用法详解内容,有兴趣的朋友们可以学习参考下。
    2020-12-12
  • 你知道Java中的注解可以继承吗?

    你知道Java中的注解可以继承吗?

    注解想必大家都用过,也叫元数据,是一种代码级别的注释,可以对类或者方法等元素做标记说明。那么今天我想问大家的是类被继承了,注解能否继承呢?可能会和大家想的不一样,感兴趣的可以往下看
    2022-12-12
  • Java数组常见应用详解【创建、遍历、排序、查找】

    Java数组常见应用详解【创建、遍历、排序、查找】

    这篇文章主要介绍了Java数组常见应用,结合实例形式详细分析了java数组的基本定义、创建、遍历、排序、查找等相关操作技巧与使用注意事项,需要的朋友可以参考下
    2020-02-02
  • Springboot中yml文件不生效原因分析及解决

    Springboot中yml文件不生效原因分析及解决

    这篇文章给大家介绍了Springboot中yml文件不生效原因分析及解决方法,通过图文给大家讲解的非常详细,对大家解决问题有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Java面试必考的关键字的用法汇总

    Java面试必考的关键字的用法汇总

    这篇文章主要为大家详细介绍了Java中的几种关键字相关知识,本文比较适合刚入坑Java的小白以及准备秋招的大佬阅读,需要的小伙伴快收藏起来吧
    2023-06-06

最新评论