堆排序(Heap Sort)

堆排序是一种高效的排序算法,它利用了堆的数据结构来实现。堆是一种特殊的完全二叉树,分为最大堆和最小堆两种类型。在最大堆中,父节点的值大于等于其子节点的值;而在最小堆中,父节点的值小于等于其子节点的值。

堆排序的基本思想是:

  1. 将待排序的序列构造成一个大顶堆(或小顶堆)。
  2. 此时,整个序列的最大值(或最小值)就是堆顶的根节点。
  3. 将堆顶元素与末尾元素进行交换,使末尾元素最大(或最小)。
  4. 然后对剩余的 n-1 个元素重新构造堆,得到 n-1 个元素的最大(或最小)值。
  5. 如此反复执行,直到整个序列有序。

代码实现:

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

        for (int i = n / 2 - 1; i >= 0; i--){
            heapify(arr, n, i);
        }
            
        for (int i = n - 1; i > 0; i--) {
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            heapify(arr, i, 0);
        }
    }

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

        if (l < n && arr[l] > arr[largest])
            largest = l;

        if (r < n && arr[r] > arr[largest])
            largest = r;

        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
            heapify(arr, n, largest);
        }
    }

    public void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
    }

    public static void main(String[] args) {
        int[] arr = {12, 11, 13, 5, 6, 7};
        int n = arr.length;

        HeapSort heapSort = new HeapSort();
        heapSort.heapSort(arr);

        heapSort.printArray(arr);
    }
}
相关推荐
Black蜡笔小新2 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
凡人叶枫2 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
摇滚侠2 小时前
JavaSE 和 JavaEE 是什么意思
java·java-ee
想带你从多云到转晴2 小时前
03、JAVAEE---多线程(三)
java
怪兽学LLM3 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪3 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
CC数学建模3 小时前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
matlabgoodboy3 小时前
计算机java程序代写python代码编写c/c++代做qt设计php开发matlab
java·c语言·python
leo__5203 小时前
MATLAB实现牧羊人算法
开发语言·算法·matlab
视觉小萌新3 小时前
C++利用libmicrohttpd制作交互网页端——C1
java·c++·交互