十大排序算法之——堆排序算法(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)。这使得堆排序在处理大规模数据时具有很高的效率。同时,堆排序是一种不稳定的排序算法,即相等的元素在排序后可能会改变其相对顺序。

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

相关推荐
kaiaaaa11 分钟前
算法训练第十一天
数据结构·算法
?!71413 分钟前
算法打卡第18天
c++·算法
pengyu22 分钟前
【Java设计原则与模式之系统化精讲:壹】 | 编程世界的道与术(实战指导篇)
java·后端·设计模式
日月星辰Ace25 分钟前
JVM 垃圾回收简介
java
springfe010126 分钟前
构建大顶堆
前端·算法
掉头发的王富贵28 分钟前
Arthas神器入门:动态调试Java应用,轻松搞定生产环境Bug!
java·后端·debug
Java陈序员33 分钟前
再见 Navicat!一款开源的 Web 数据库管理工具!
java·react.js·docker
程序员爱钓鱼35 分钟前
Go语言并发模型与模式:Worker Pool 模式
后端·go·排序算法
oraen39 分钟前
11种排序算法的简单实鉴和简单性能测试
排序算法
知其然亦知其所以然1 小时前
RAG 结果太水?用 RRF + Reranker 重排,效果翻倍提升!
java·后端·llm