zoukankan      html  css  js  c++  java
  • python实现堆排序

    理论知识:

      

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

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

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

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

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

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

    def 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]))
  • 相关阅读:
    python3数据库配置,远程连接mysql服务器
    Ubuntu 16.04安装JDK
    用Python从零开始创建区块链
    理解奇异值分解SVD和潜在语义索引LSI(Latent Semantic Indexing)
    gensim介绍(翻译)
    记一次浅拷贝的错误
    Heap queue algorithm
    Python
    python列表中插入字符串使用+号
    Linux(Ubuntu)使用 sudo apt-get install 命令安装软件的目录在哪?
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/10124153.html
Copyright © 2011-2022 走看看