堆排序

作者: 蓬莱辰 | 来源:发表于2018-11-04 12:02 被阅读0次

构建堆:

插入的第index个元素与其父比较,如果大,则交换,然后继续与其父交换。

public static void heapInsert(int[] arr, int index) {
    while (arr[index] > arr[(index - 1) / 2]) {
        swap(arr, index, (index - 1) / 2);
        index = (index - 1) / 2;
    }
}

调整堆:

找到两个孩子,与大的交换,直到超出堆的大小

public static void heapify(int[] arr, int index, int heapSize) {
    int left = index * 2 + 1;
    while (left < heapSize) {
         // 左右中较大的
        int largest = left + 1 > heapSize && arr[left + 1] < arr[left] ? left + 1 : left;
        largest = arr[index] > arr[largest] ? index : largest;
        // 如果index最大,则不需要交换
        if (index == largest) {
            break;
        }
        // 找到两个孩子,与大的交换
        wap(arr, index, largest);
        // 继续while
        index = largest;
        left = index * 2 + 1;
    }
}

堆排序:

堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

堆是无序的,构建完堆后,将堆顶与最后一个元素交换,堆的大小减1,则数组中最后一个元素是最大值,循环,调整堆,大小减1,则倒数第二个,倒数三个······

public static void heapSort(int[] arr) {
    if (arr == null || arr.length < 1) {
        return;
    }
    // 构建大根堆
    for (int i = 0; i < arr.length; i++) {
        heapInsert(arr, i);
    }
    // // 堆顶为最大值,堆顶与堆的最后一个交换,heapify 之后堆顶为最大,
    // 最大值为最后一个
    int heapSize = arr.length;
    swap(arr, 0, --heapSize);
    while (heapSize > 0) {
        heapify(arr, 0, heapSize);
        swap(arr, 0, --heapSize);
    }
}

初始化建堆的时间复杂度为O(n),排序重建堆的时间复杂度为nlog(n),所以总的时间复杂度为O(n+nlogn)=O(nlogn)。另外堆排序的比较次数和序列的初始状态有关,但只是在序列初始状态为堆的情况下比较次数显著减少,在序列有序或逆序的情况下比较次数不会发生明显变化。

相关文章

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆和堆排序

    最小K个数 堆排序 堆排序

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • iOS算法总结-堆排序

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

  • 堆排序

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

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 堆排序

    堆排序

  • C++基础入门之模板堆排序(上):模板上的list的创造与操作

    整段源码链接C++的模板元堆排序 要点 组建数据结构list 组建对list的各种基本操作 堆排序中组建堆排序个个...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

网友评论

      本文标题:堆排序

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