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

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

相关推荐
z落落5 分钟前
C# 静态成员 vs 非静态成员(调用规则+内存特点)+只读和常量 const常量 / readonly / static readonly 三者终极区别
java·开发语言·c#
java1234_小锋11 分钟前
LangChain4j 开发Java Agent智能体- 整合SpringBoot4
java·开发语言·langchain4j
basketball61614 分钟前
C++进阶:3. unique_ptr 现代C++内存管理的基石
java·jvm·c++
许彰午19 分钟前
13_HashMap底层原理详解
算法·哈希算法
GIOTTO情19 分钟前
基于 NLP 情感加权算法的智能舆情处置系统架构与落地实现
人工智能·算法·自然语言处理
zzqssliu20 分钟前
跨境代购系统的物流和通知模块重构思考:从设计模式到生产落地
java·设计模式·重构
appearappear23 分钟前
一句sql 根据明细数据状态,精确更新一个主单主状态
java
无风听海24 分钟前
PKCE 的 S256 算法深度剖析:从协议设计到密码学原理
javascript·网络·算法·密码学
凌波粒26 分钟前
LeetCode--530.二叉搜索树的最小绝对差(二叉树)
算法·leetcode·职场和发展
许彰午26 分钟前
04_Java数组操作全解
java·开发语言·python