美文网首页数据结构与算法
经典排序算法 --- 堆排序

经典排序算法 --- 堆排序

作者: 潇萧之炎 | 来源:发表于2019-04-09 22:53 被阅读2次

    堆的定义:

    堆是具有以下性质的完全二叉树:
    1.每个结点的值都大于或等于其左右孩子结点的值,称为大顶(根)堆;
    2.或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶(根)堆。
    一般升序采用大顶堆,降序采用小顶堆。

    堆的存储结构:

    堆排序存储结构.PNG

    堆排序的基本思想:

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

    堆排序的基本思路:

    1.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
    2.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
    3.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

    堆排序动图展示:

    堆排序动图展示.gif

    总结:

    堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。它也是不稳定排序。不适合待排序列个数较少的情况。
    它的最坏,最好,平均时间复杂度均为O(nlogn)。

    Python实现:

    def heap_adjust(array, start, end):
        temp = array[start]
        child = 2 * start
        while child <= end:
            if child < end and array[child] < array[child + 1]:
                child += 1
            if temp >= array[child]:
                break
            array[start] = array[child]
            start = child
            child *= 2
        array[start] = temp
    
    def heap_sort(array):
        # 从最后一个有孩子结点的结点开始调整最大堆
        first = len(array) // 2 - 1
        for start in range(first, -1, -1):
            heap_adjust(array, start, len(array) - 1)
    
        # 将最大的数放到堆的最后一个位置,并继续调整排序
        for end in range(len(array) - 1, 0, -1):
            array[0], array[end] = array[end], array[0]
            heap_adjust(array, 0, end - 1)
    
    if __name__ == "__main__":
        array = [19, 43, 15, 0, 2, 37, 92, 10, 13, 63]
        heap_sort(array)
        print(array)
    

    动图展示: https://www.cnblogs.com/onepixel/articles/7674659.html
    堆排序:https://www.cnblogs.com/chengxiao/p/6129630.html
    https://blog.csdn.net/m0_37925202/article/details/80818561

    相关文章

      网友评论

        本文标题:经典排序算法 --- 堆排序

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