Python-堆排序

import random


def sift(li, low, high):
    """
    堆调整
    :param li: 列表
    :param low: 堆的根节点位置
    :param high: 堆的最后一个元素的位置
    :return:
    """
    i = low  # i最开始指向根节点
    j = 2 * i + 1  # j开始是左孩子
    tmp = li[low]  # 把堆顶存起来
    while j <= high:  # 只要j位置有数
        if j + 1 <= high and li[j + 1] > li[j]:  # 如果右孩子有 并且比较大
            j = j + 1  # j指向右孩子
        if li[j] > tmp:
            li[i] = li[j]
            i = j  # 往下看一层
            j = 2 * i + 1
        else:  # tmp更大,把tmp放到i的位置上
            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):
        # i表示建堆的时候调整的部分的根的下标
        sift(li, i, n - 1)
    # 建堆完成了
    print(li, "堆列表")
    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


li = list(range(20))  # 生成一个有序列表
random.shuffle(li)  # 打乱列表
print(li, "原列表")
heap_sort(li)
print(li, "排序后")

 

堆的内置模块:

import heapq  # q->queue 优先队列
import random

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

heapq.heapify(li)  # 建堆

n = len(li)
for _ in range(n):
    print(heapq.heappop(li), end=",")

 

posted on 2023-02-01 14:30  夜黎i  阅读(30)  评论(0)    收藏  举报

导航