十大排序算法之——堆排序算法(Java实现)及思路讲解

堆排序是一种非常有效的排序算法,它利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序可以分为两个主要部分:建堆和堆调整。

以下是Java实现堆排序的详细过程,我会尽量控制在1500字以内:

首先,我们定义堆排序的主体类,并声明一些必要的变量和方法:

java 复制代码
public class HeapSort {
    public void sort(int[] arr) {
        int len = arr.length;

        // 第一步:构建大顶堆
        buildMaxHeap(arr, len);

        // 第二步:进行堆排序
        for (int i = len - 1; i > 0; i--) {
            // 将当前最大元素 arr[0] 与末尾元素交换
            swap(arr, 0, i);
            // 重新对剩余元素构建大顶堆
            maxHeapify(arr, 0, i);
        }
    }

    // 构建大顶堆
    private void buildMaxHeap(int[] arr, int len) {
        for (int i = len / 2 - 1; i >= 0; i--) {
            maxHeapify(arr, i, len);
        }
    }

    // 调整大顶堆
    private void maxHeapify(int[] arr, int i, int len) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int largest = i;
        if (left < len && arr[left] > arr[largest]) {
            largest = left;
        }
        if (right < len && arr[right] > arr[largest]) {
            largest = right;
        }
        if (largest != i) {
            swap(arr, i, largest);
            maxHeapify(arr, largest, len);
        }
    }

    // 交换数组中的两个元素
    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

上述代码中,sort方法是堆排序的入口,它首先调用buildMaxHeap方法构建一个大顶堆,然后依次将堆顶元素(即当前最大元素)与末尾元素交换,并对剩余元素重新构建大顶堆,直到所有元素排序完成。

buildMaxHeap方法从最后一个非叶子节点开始,依次向前遍历,对每个节点调用maxHeapify方法进行堆调整,以确保每个节点的子树都满足大顶堆的性质。

maxHeapify方法是堆调整的核心,它首先找出当前节点及其子节点中的最大元素,如果最大元素不是当前节点,则交换当前节点和最大元素,并对交换后的子树递归调用maxHeapify方法进行堆调整。

swap方法是一个辅助方法,用于交换数组中的两个元素。

现在,我们可以使用上述的HeapSort类来进行堆排序:

java 复制代码
public class Main {
    public static void main(String[] args) {
        int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
        HeapSort heapSort = new HeapSort();
        heapSort.sort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

运行上述代码,将会输出排序后的数组元素:1 1 2 3 3 4 5 5 5 6 9

堆排序的时间复杂度为O(nlogn),其中n为待排序元素的个数。由于堆排序是一种原地排序算法,其空间复杂度为O(1)。这使得堆排序在处理大规模数据时具有很高的效率。同时,堆排序是一种不稳定的排序算法,即相等的元素在排序后可能会改变其相对顺序。

总的来说,堆排序是一种非常有效且实用的排序算法,它在处理大规模数据时具有很高的效率,并且在实际应用中有着广泛的应用。

相关推荐
极客先躯28 分钟前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
码至终章31 分钟前
kafka常用目录文件解析
java·分布式·后端·kafka·mq
不能只会打代码33 分钟前
蓝桥杯例题一
算法·蓝桥杯
Mr.Demo.35 分钟前
[Spring] Nacos详解
java·后端·spring·微服务·springcloud
OKkankan39 分钟前
实现二叉树_堆
c语言·数据结构·c++·算法
luoganttcc1 小时前
华为升腾算子开发(一) helloword
java·前端·华为
Dlwyz1 小时前
Maven私服-Nexus3安装与使用
java·maven
智_永无止境1 小时前
Springboot使用war启动的配置
java·spring boot·后端·war
九月十九2 小时前
AviatorScript用法
java·服务器·前端
翻晒时光2 小时前
深入解析Java集合框架:春招面试要点
java·开发语言·面试