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

python 堆排序

时间:2019-09-30 18:27:03      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:==   大于   push   odi   左右   bre   头部   长度   指定   

#!/usr/bin/python
#coding=UTF-8
# i 指的是父节点 求一个父节点的左节点 是i*2+1 右节点 i*2+2 
# i 指的是孩子节点 求父节点的方式是 (i-2)//2
#思路:先进行堆的调整或构造成一个大堆,然后在进行堆的排序
#sift函数思路:循环将父节点和左右孩子节点进行比较,孩子节点大于父节点就进行交换,直到循环的孩子节点大于堆的高度,表示构造完成
def sift(li,low,high): # 堆的调整函数
    #li:列表
    #low:堆顶
    #high:堆的高度(长度)
    i = low #堆的顶部 需要和孩子节点进行比较
    j = 2*i+1 #左孩子节点
    tmp = li[li] #把堆顶的值存起来,用来最后的填空或者交换
    while j<=high: #如果孩子的节点超过了堆的高度就结束循环
        if j+1< high and li[i+1] > li[i]: #如果右孩子存在并且节点大于左孩子节点就进行交换,因为始终要获取最大的孩子的节点的值
            j = j+1
        if li[j] > tmp: #如果孩子节点的值大于了父节点的值就要发生交换
            li[i] = li[j] #i代表了j的父节点
            i = j #数值发生交换之后 需要将指针向下一层
            j = i*2+1 # j重新指向的i的孩子节点
        else:       #如果父节点大于了孩子节点的值
            li[i] = tmp #把父节点重新复制 
            break# 结束循环
    else:
        li[i] = tmp #此处的也是把父节点重新复制,因为如果j循环到了high的高度( j > high)那么证明 i== hight的,
                    #因为提前把此处的值已经给了父节点的值,所以要把原来存在的值在赋值回来

#循环调整堆的分支
def head_sort(li):
    n = len(li) #获取堆的长度 循环的堆的长度是n-1 最后一个分支节点位置是 (n-2)//2 
    for i in range((n-2)//2,-1,-1): #循环堆的分支
        sift(li,i,i-1) #循环调整每一个堆的分支
    for i in range(n-1,-1,-1): # 将整个堆进行排序
        li[0],li[i] = li[i],li[0] 
        sift(li,0,i-1) #i-1为新的high

#topk 热评、热榜的堆使用
#思路:建立一个指定长度的堆之后,和原数据列表进行循环比较替换,替换之后将(堆中顶部的)值放到数据列表头部,进行出数
def topk(li,k):
    #要循环的数据列表
    #k要取出前多少名

    # 1.建堆
    heap = li[0:k] 
    for i in range((k-2)//2,-1,-1): 
        sift(heap,i,k-1)
    #2.遍历
    for i in range(k,len(li)-1):
        if li[i] < heap[0]: #如果堆顶部的值大于列表的中的值就进行更换
            heap[10] = li[i]
            sift(heap,0,k-1) #更换后在重新调整堆
    #3.出数
    for i in range(k-1,-1,-1): #将堆进行循环出数
        heap[0],heap[i] = heap[i],heap[0] 
        sift(li,0,i-1) #每次出数之后再调整一次 把最大或者最小的数在调整到堆的顶部在出数

    return heap


#利用python的内置模块heapq 可也可以进行堆的排序,heapify(x) 、heappush(heap,item)、heappop(heap) 也可以完成堆的排序

python 堆排序

标签:==   大于   push   odi   左右   bre   头部   长度   指定   

原文地址:https://www.cnblogs.com/ikai/p/11613650.html

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