码迷,mamicode.com
首页 > 编程语言 > 详细

python实现堆排序

时间:2018-12-15 18:48:58      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:lse   并且   print   int   span   建立   heap   有序   lis   

理论知识:

  

  二叉树:度不超过2的树(节点最多有两个叉)

  满二叉树:一个二叉树,如果每一个层的节点数都达到最大值,则这个二叉树就是满二叉树。

  完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的节点都集中在该层最左边的若干位置的二叉树。

  大顶堆:一颗完全二叉树,满足任一节点都比其孩子节点大。

  小顶堆:一颗完全二叉树,满足任一节点都比其孩子节点小。

 

建堆过程
  1.建立堆
  2.得到堆顶元素,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序
  3.堆顶元素为第二大元素
  4.重复步骤3,知道堆变空

 

import randomdef sift(li, low, high):
    tmp = li[low]
    i = low
    j = 2 * i + 1
    while j <= high: # 情况2:i已经是最后一层了
        if j + 1 <= high and li[j+1] > li[j]: # 右孩子存在并且大于左孩子
            j += 1
        if tmp < li[j]:
            li[i] = li[j]
            i = j
            j = 2 * i + 1
        else:
            break  # 情况1:j位置比tmp小
    li[i] = tmp


def heap_sort(li):
    # 1.建堆
    n = len(li)
    for low in range(n//2-1, -1, -1):
        sift(li, low, n-1)
    # 2. 挨个输出 退休-棋子-调整 重复n次或n-1次
    for high in range(n-1, -1, -1):
        li[0], li[high] = li[high], li[0]
        sift(li, 0, high-1)

li = list(range(100000))
random.shuffle(li)
heap_sort(li)

 

 

python自带模块

import heapq
# priority queue

# li = [5,7,9,8,4,1,6,2,3]
# heapq.heapify(li)
# heapq.heappush(li, 0)
# print(heapq.heappop(li))
#
# print(li)

# print(heapq.nlargest(5, [1,2,5,4,7,8,9,6,3]))

 

python实现堆排序

标签:lse   并且   print   int   span   建立   heap   有序   lis   

原文地址:https://www.cnblogs.com/xiao-xue-di/p/10124153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!