zoukankan      html  css  js  c++  java
  • 堆排序算法(Python版本)

    #堆排序的python版本代码
    #堆排序的向下调整函数
    #大根堆的建立方函数
    def sift(li,low,high): #li是指列表,low是指根节点位置,high是指最后一个元素位置
    i=low #最开始跟节点的位置
    j=2*i+1 #左边下一层孩子节点
    tmp=li[low] #把堆顶元素存下来
    while j<=high: #只要j位置有节点,有数字便可以一直循环
    if j+1<high and li[j+1]>li[j]: #右边孩子有并且右边更大
    j=j+1 #把j指向j+1,右边孩子大于左边,指向右边
    if li[j]>tmp:
    li[i]=li[j]
    i=j #往下看一层
    j=2*j+1
    else: #tmp更大的情况,把tmp放上来
    li[i]=tmp #把tmp放到某一级领导的位置上
    break
    else:
    li[i]=tmp #把tmp放在叶子节点上去

    #堆排序的算法实现
    def heap_sort(li):
    '''构造堆'''
    n=len(li)
    for i in range((n-2)//2,-1,-1):
    sift(li,i,n-1)
    #以上表示大根堆构造完成
      #挨个吐出来数字
    for i in range(n-1,-1,-1): #i是指当前堆的最后一个元素
    li[0],li[i]=li[i],li[0]
    sift(li,0,i-1) #i-1是新的堆的high
    #以上表示吐出来数字的过程

    import random
    li=[i for i in range(1000)]
    random.shuffle(li)
    #li=[1,2,3,4,5,4,9,2,1,4,5,6,3,3,6,2]
    print(li)
    heap_sort(li)
    print(li)

    
    
    #堆排序的内置模块heapq模块即可实现
    import heapq #q->是指queue优先队列(先进先出,大的先出,小的先出)
    import random

    li=list(range(100))
    random.shuffle(li)
    print(li)

    l=1000
    heapq.heappush(li,l) #是指往后面添加元素

    heapq.heapify(li) #建立堆的函数
    print(li)

    n=len(li)
    for i in range(n):
    print(heapq.heappop(li),end=",") #heappop函数可以每次吐出列表剩下的最小的数

  • 相关阅读:
    Explain用法
    轻量快速的 Python ASGI 框架 uvicorn
    conda常用命令
    ubuntu 安装并配置zsh
    ubuntu安装zsh终端
    /etc/profile、/etc/bashrc、.bash_profile、.bashrc
    python用List的内建函数list.sort进行排序
    python对象排序
    修改python接口返回给前端的格式封装
    linux设置uwsgi开机自启
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12411741.html
Copyright © 2011-2022 走看看