美文网首页
入门算法:堆排序

入门算法:堆排序

作者: 半理想主义 | 来源:发表于2020-09-01 16:56 被阅读0次

上手难度:★★★

算法复杂度:O (nlgn)

排序思想:

对堆结构比较了解的话就很好理解
利用大顶堆的性质,将最大的顶点元素换到最后一个位置,然后数组长度减1,再将剩余的堆重新构建一个大顶堆,然后又将最大的顶点元素换到最后一个位置,此时的最后一个位置实际上是倒数第二个位置,依次往复,一边缩小数组的长度,一边将最大的顶点元素倒序放到合适的位置即可实现排序

代码实现:

public class HeapSort {

    public static int[] heapSort(int[] arr){

        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);
        }
    }

    /**
     * 大顶堆的序号是从0开始的,不然left就是等于2*i了
     * 这个方法的目的是把大值换到i的位置
     */
    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;
    }

    public static void main(String[] args) {

        int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};

        heapSort(arr);

        for( int i = 0 ; i < arr.length ; i ++ ){
            System.out.print(arr[i]);
            System.out.print(' ');
        }

    }
}

优点:思路较容易理解

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 算法入门——归并排序、希尔排序

    上篇文章我们学习了算法入门——堆排序,这篇文章我们学习算法入门——归并排序、希尔排序。 归并排序 归并排序是将一个...

  • 算法入门——堆排序

    上篇文章我们学习了算法入门——插入排序、快速排序,这篇文章我们学习算法入门——堆排序。 堆 堆是一种特殊的完全二叉...

  • 算法入门:堆排序

    基础概念#### 堆排序是比较基础的排序算法,也是我认为比较难的一种算法,因为它的流程比较多,理解起来不会像冒泡排...

  • 入门算法:堆排序

    上手难度:★★★ 算法复杂度:O (nlgn) 排序思想: 对堆结构比较了解的话就很好理解利用大顶堆的性质,将最大...

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • 堆排序算法思想

    前两天看了看堆排序算法,啃了半天的书,最后搞明白了堆排序算法,今天有时间给大家说说这个堆排序算法。首先讲一下算法的...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 常用排序算法之堆排序

    堆排序算法 运行 输出

网友评论

      本文标题:入门算法:堆排序

      本文链接:https://www.haomeiwen.com/subject/khivsktx.html