堆排序算法

简介: 堆排序算法

一、堆的特性:堆是一种特殊的树形数据结构,即完全二叉树。堆分为大顶堆和小顶堆。

大顶堆:每个节点的值都大于或等于其两个子节点的值,在堆排序算法中用于升序排序。

小顶堆:每个节点的值都小于或等于其两个子节点的值,在堆排序算法中用于降序排序。

 

二、堆排序步骤:

       1. 构造一个大顶堆(或小顶堆),取堆顶数字(也就是最大值或最小值)

       2. 再将剩下的数字构建一个大顶堆(或小顶堆),取堆顶数字(也就是剩下值当中的最大值(或最小值))

       3. 重复以上操作,直到取完堆中的数字,最后得到一个从大到小(或从小到大)排序的序列

 

基本思路:

将所有元素构成一个堆的形式,然后比较每一个二叉树,将最大的或最小的与根节点元素互换位置,最后将最顶根节点取出,再从左到右、从下到上的方式将尾节点放到最顶根节点上,再重复上述操作进行排序取出最大或最小元素,以此类推,直到所有元素取出。

 

平均时间复杂度:image.png

 

 image.png

import java.util.Arrays;
public class HeapSort {
    public static void main(String[] args) throws Exception {
        int[] arr = {3, 45, 78, 99, 45, 11, 64, 55, 52, 11, 18, 66, 17, 37, 199, 120, 54, 49};
        System.out.println("未排序的数组:" + Arrays.toString(arr));
        sort(arr);
        System.out.println("排序的数组:" + Arrays.toString(arr));
    }
    public static int[] sort(int[] arr) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
        int len = arr.length;
        buildMaxHeap(arr, len);
        for (int i = len - 1; i > 0; i--) {
            swap(arr, 0, i);
            len--;
            heapify(arr, 0, len);
        }
        return arr;
    }
    private static void buildMaxHeap(int[] arr, int len) {
        for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
            heapify(arr, i, len);
        }
    }
    private static void heapify(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);
            heapify(arr, largest, len);
        }
    }
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题
数据结构与算法:堆排序和TOP-K问题
|
1天前
|
存储 人工智能 算法
深入浅出堆排序: 高效算法背后的原理与性能
深入浅出堆排序: 高效算法背后的原理与性能
52 1
|
1天前
|
移动开发 算法 前端开发
前端算法之堆排序
前端算法之堆排序
15 1
|
1天前
|
人工智能 搜索推荐 算法
sort-04-heap sort 堆排序算法详解
这是一个关于排序算法的系列文章摘要,包括了10篇关于不同排序算法的链接,如冒泡排序、快速排序、选择排序、堆排序等。堆排序是一种基于比较的排序算法,利用了近似完全二叉树的结构并满足最大堆或最小堆的性质。最大堆中,每个节点的值都大于或等于其子节点。文章详细解释了最大堆的概念、节点访问方式以及堆的操作,包括堆调整和堆排序的过程,并通过图解展示了堆排序的具体步骤。此外,还提供了一个Java实现的堆排序代码示例。整个排序系列来源于一个开源项目,读者可以通过链接查看完整内容。
sort-04-heap sort 堆排序算法详解
|
1天前
|
算法
堆排序+TopK问题——“数据结构与算法”
堆排序+TopK问题——“数据结构与算法”
|
1天前
|
算法 搜索推荐 数据挖掘
【算法与数据结构】堆排序&&TOP-K问题
【算法与数据结构】堆排序&&TOP-K问题
|
1天前
|
搜索推荐 算法
【八大经典排序算法】堆排序
【八大经典排序算法】堆排序
13 0
|
1天前
|
搜索推荐 算法
【排序算法】堆排序详解与实现
【排序算法】堆排序详解与实现
|
1天前
|
搜索推荐 C语言
排序算法-选择/堆排序(C语言)
排序算法-选择/堆排序(C语言)
13 0
|
1天前
|
搜索推荐 算法 Java
【数据结构排序算法篇】----堆排序【实战演练】
【数据结构排序算法篇】----堆排序【实战演练】
25 2