Python排序之-堆排序

Posted 诺禾生信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python排序之-堆排序相关的知识,希望对你有一定的参考价值。

堆排序

堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。

堆是一个近似完全二叉树的结构,并同时满足堆性质:

  • 子结点的键值或索引总是不小于(或者不大于)它的父节

  • 堆总是一棵完全二叉树(Complete Binary Tree)

完全二叉树是由满二叉树(Full Binary Tree)而引出来的。除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树称为满二叉树。 如果除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点,这样的二叉树被称为完全二叉树。

需要注意的是,堆只对父子节点做了约束,并没有对兄弟节点做任何约束,左子节点与右子节点没有必然的大小关系。

如果用数组存储堆中的数据,逻辑结构与存储结构如下:

Python排序之-堆排序

堆排序

初始时把要排序的n个数看作是一棵顺序存储的完全二叉树,调整它们的存储顺序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依次类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。这个过程就称为堆排序。

先来视觉感受一下堆排序:

或者慢一点的:

python实现

def heap_sort(list):    # 创建最大堆
    for start in range((len(list) - 2) // 2, -1, -1):
        sift_down(list, start, len(list) - 1) 
    # 堆排序

   for end in range(len(list) - 1, 0, -1):

       list[0], list[end] = list[end], list[0]

       sift_down(list, 0, end - 1)

   return list

# 最大堆调整def sift_down(lst, start, end):    root = start    while True:        child = 2 * root + 1

       if child > end:

           break

       if child + 1 <= end and lst[child] < lst[child + 1]:            child += 1        if lst[root] < lst[child]:            lst[root], lst[child] = lst[child], lst[root]

           root = child

       else:

           break



以上是关于Python排序之-堆排序的主要内容,如果未能解决你的问题,请参考以下文章

Python堆排序之heapq

你需要知道的九大排序算法Python实现之堆排序

Java排序算法 - 堆排序的代码

重温基础算法内部排序之堆排序法

重温基础算法内部排序之堆排序法

常见排序算法之python实现