[排序算法]堆排序

目录

1.基本思想

2.堆排序的步骤

3.堆排序算法的实现

4.堆排序的特点:

5.总结


1.基本思想

堆排序(Heap Sort)的基本思想是利用堆这种数据结构进行排序。堆是一个完全二叉树,分为最大堆(Max Heap)和最小堆(Min Heap)两种类型。

  1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
  2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

2.堆排序的步骤

堆排序的基本步骤:

  1. 建堆(Heapify):

    • 将待排序数组看作是一个完全二叉树,并构建一个最大堆(Max Heap)或最小堆(Min Heap)。
    • 从最后一个非叶子节点开始,依次向前调整节点,使得每个节点都满足堆的性质(父节点的值大于/小于子节点的值)。
  2. 排序:

    • 从堆顶(根节点)取出最大(最小)元素,与堆的最后一个元素交换位置。
    • 然后对剩余的堆进行调整,使其重新满足堆的性质。
    • 不断重复上述步骤,直到整个数组有序。

3.堆排序算法的实现

Java 实现堆排序的示例代码:

java 复制代码
public class HeapSort {

    public static void heapSort(int[] arr) {
        int n = arr.length;

        // Build heap (rearrange array)
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // One by one extract an element from heap
        for (int i = n - 1; i > 0; i--) {
            // Move current root to end
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }

    public static void heapify(int[] arr, int n, int i) {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;

        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }

        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }

        if (largest != i) {
            int temp = arr[i];
            arr[i] = arr[largest];
            arr[largest] = temp;

            heapify(arr, n, largest);
        }
    }

    public static void main(String[] args) {
        int[] arr = {12, 11, 13, 5, 6, 7};
        System.out.println("Original Array: " + Arrays.toString(arr));

        heapSort(arr);

        System.out.println("Sorted Array: " + Arrays.toString(arr));
    }
}

在上面的示例中,heapSort 方法用于执行堆排序,heapify 方法用于维护堆的性质。

4.堆排序的特点:

  • 时间复杂度: 堆排序的时间复杂度为 O(n*log(n)),其中 n 是数组的长度。这是因为建堆的时间复杂度为 O(n),每次调整堆的时间复杂度为 O(log(n)),共需要调整 n-1 次。
  • 空间复杂度: 堆排序是原地排序算法,只需要常数级别的额外空间。
  • 稳定性: 堆排序是一种不稳定的排序算法,因为在调整堆的过程中可能会改变相同元素的顺序

5.总结

堆排序是一种高效的排序算法,尤其适用于需要稳定时间复杂度的情况下。它不需要额外的空间,是原地排序算法,适用于大规模数据的排序。

PS:如有错漏之处,敬请指正

相关推荐
九章云极AladdinEdu1 分钟前
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
java·开发语言·人工智能·深度学习·测试工具·负载均衡·transformer
佩奇的技术笔记4 分钟前
Java学习手册:客户端负载均衡
java·负载均衡
天上路人19 分钟前
AI神经网络降噪算法在语音通话产品中的应用优势与前景分析
深度学习·神经网络·算法·硬件架构·音视频·实时音视频
好吃的肘子23 分钟前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
可乐加.糖34 分钟前
项目版本管理和Git分支管理方案
java·git·目标跟踪·gitlab·敏捷流程·源代码管理
汉克老师38 分钟前
GESP2025年3月认证C++二级( 第三部分编程题(1)等差矩阵)
c++·算法·矩阵·gesp二级·gesp2级
sz66cm1 小时前
算法基础 -- 小根堆构建的两种方式:上浮法与下沉法
数据结构·算法
緈福的街口1 小时前
【leetcode】94. 二叉树的中序遍历
算法·leetcode
wowocpp1 小时前
spring boot Controller 和 RestController 的区别
java·spring boot·后端
小刘要努力呀!1 小时前
嵌入式开发学习(第二阶段 C语言基础)
c语言·学习·算法