堆排序

import random


def sift(data, low, high):
    """
    :param data: 列表
    :param low: 堆的根节点位置
    :param high: 堆的高度
    :return:
    """
    i = low  # 最开始指向根的节点
    j = 2 * i + 1  # j 最开始左边的节点
    tmp = data[low]   # 把堆顶存起来
    while j <= high:    # 只要j位置有数
        if j + 1 <= high and data[j] < data[j + 1]: # 如果右边有并且比较大
            j += 1  # 指向右节点
        if tmp < data[j]:
            data[i] = data[j]
            i = j   # 往下看一层
            j = 2 * i + 1
        else:   # tmp更大,把tmp放在i位置
            data[i] = tmp  
            break
    else:
        data[i] = tmp   # 把tmp放在叶子节点


def heap_sort(data):
    n = len(data)
    for i in range((n-2) // 2, -1, -1):
        sift(data, i, n - 1)
    for i in range(n - 1, -1, -1):
        data[0], data[i] = data[i], data[0]
        sift(data, 0, i - 1)


data = [i for i in range(100)]
random.shuffle(data)
print(data)
heap_sort(data)
print(data)
posted @ 2022-01-03 22:55  下个ID见  阅读(29)  评论(0)    收藏  举报