• Python 堆排序


      原本想写一篇关于堆排序的详细教程的,发现自己不会画图,QAQ。而且也不一定会画的比别人好看多少,尴尬的我上我的代码把。

    我简单的说一下思路:我们构建的堆结构是逻辑结构。如果列表需要升序排列就构建一个大顶堆,降序就小顶堆。大顶堆的定义是该节点比其左右子节点都大,小顶堆相反。第一步构建完大顶堆,堆顶元素就是列表中最大元素,第二步把堆顶元素和第一个元素交换位置,第三步再调整成大顶堆,循环第二步和第三步。直到列表有序。堆排序是不稳定的(不稳定:不保证列表中两个相等的数的前后位置在排序后和排序前一样)。

     1 import math
     2 
     3 
     4 def sort(arr):
     5     # 构建大顶堆, math.floor(), 向下取整, 因为构建大顶堆是从最后一个非叶子节点开始的
     6     for i in range(math.floor(len(arr) / 2) - 1, -1, -1):
     7         adjust_heap(arr, i, len(arr))
     8     # 调整 和 把堆顶这个最大数和最后一个数交换
     9     for i in range(len(arr) - 1, 0, -1):
    10         arr[i], arr[0] = arr[0], arr[i]
    11         adjust_heap(arr, 0, i)
    12 
    13 
    14 def adjust_heap(arr, i, length):
    15     '''
    16     调整,每一次传过来的 i 节点及其子节点调整成大顶堆,
    17     如果不调其子节点有可能导致其子节点不是一个大顶堆
    18     '''
    19     temp = arr[i]
    20     k = 2 * i + 1
    21     while k < length:
    22         if k + 1 < length and arr[k] < arr[k + 1]:
    23             k += 1
    24         if arr[k] > temp:
    25             arr[i] = arr[k]
    26             i = k
    27         k = k * 2 + 1
    28     arr[i] = temp
    29 
    30 
    31 test_list = [9, 8, 7, 6, 5, 4, 8, 2, 1]
    32 sort(test_list)
    33 print(test_list)

    https://www.cnblogs.com/chengxiao/p/6129630.html 这一篇文章教的挺详细的,大家不懂的可以看一看。

  • 相关阅读:
    Codefores 506A Mr. Kitayuta, the Treasure Hunter( DP && dfs )
    Goals ? Ideals ?
    HDU 5159 Card( 计数 期望 )
    HDU 1387 Team Queue( 单向链表 )
    HDU 1709 The Balance( DP )
    HDU 2152 Fruit( DP )
    HDU 1398 Square Coins(DP)
    HDU 5155 Harry And Magic Box( DP )
    HDU 3571 N-dimensional Sphere( 高斯消元+ 同余 )
    最大连续自序列
  • 原文地址:https://www.cnblogs.com/JulyShine/p/10181668.html
Copyright © 2020-2023  润新知