堆排序python

堆排序python,第1张

堆排序python 堆排序

堆排序是一个近似完全二叉树的结构,利用堆这种数据结构所设计而成的一种排序算法。

堆 *** 作:
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种 *** 作:
最大堆调整(swap):将堆的末端子节点作调整,使子节点小于父节点
创建最大堆(adjust_heap):将堆中的所有数据重新进行排序
堆排序(heap_sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

下面为堆排序 *** 作示例图:

#堆排序代码
def swap(data, root, last):
    data[root], data[last] = data[last], data[root]

#调整父节点 与孩子大小, 制作大顶堆
def adjust_heap(data, par_node, high):

    new_par_node = par_node
    j = 2*par_node +1   #取根节点的左孩子, 如果只有一个孩子 high就是左孩子,如果有两个孩子 high 就是右孩子

    while j <= high: #如果 j = high 说明没有右孩子,high就是左孩子
        if j < high and data[j] < data[j+1]: #如果这儿不判断 j < high 可能超出索引
            # 一个根节点下,如果有两个孩子,将 j  指向值大的那个孩子
            j += 1
        if data[j] > data[new_par_node]: #如果子节点值大于父节点,就互相交换
            data[new_par_node], data[j] = data[j], data[new_par_node]
            new_par_node = j #将当前节点,作为父节点,查找他的子树
            j = j * 2 + 1

        else:
            # 因为调整是从上到下,所以下面的所有子树肯定是排序好了的,
            #如果调整的父节点依然比下面最大的子节点大,就直接打断循环,堆已经调整好了的
            break
# 开始循环到 root 索引为:0 的第一个根节点, 将所有的根-叶子 调整好,成为一个 大顶堆
def heap_sort(lst):
    length = len(lst)
    last = length -1  #最后一个元素的 索引
    last_par_node = length//2 -1

    while last_par_node >= 0:

        adjust_heap(lst, last_par_node, length-1)
        last_par_node -= 1  #每调整好一个节点,从后往前移动一个节点

    # return lst

    while last > 0:
        #swap(lst, 0, last)
        lst[0], lst[last] = lst[last],lst[0]
        # 调整堆让 adjust 处理,最后已经排好序的数,就不处理了
        adjust_heap(lst, 0, last-1)
        last -= 1

    return lst #将列表返回
if __name__ == '__main__':
  a=[1,3,4,5,2,6,9,7,8,0]
  print(heap_sort(a))

输出示例结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5593129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存