python尝试简单的堆排序

import random
import math


def tree_depth(li):
    depth = int(math.log2(len(li) + 1)) + 1
    return depth


def print_line(string, fillchar, totlen, align_way):
    if align_way == 0:
        print("{0:{1}^{2}}".format(string, fillchar, totlen))
    elif align_way == -1:
        print("{0:{1}<{2}}".format(string, fillchar, totlen))
    elif align_way == 1:
        print("{0:{1}>{2}}".format(string, fillchar, totlen))


def printf_tree(li): # 打印树结构,稍微好看一些
    depth = tree_depth(li)
    before = 0
    align_way = 0

    for i in range(depth):
        thisline = ""
        if i == depth - 1:
            align_way = -1

        for j in range(pow(2, i)):
            try:
                thisline = thisline + str(li[before + j]) + " "
            except IndexError:
                break
        thisline = thisline[:-1:]
        print_line(thisline, " ", pow(2, depth - 1) * 2 - 1, align_way)
        before += pow(2, i)


def judge(li, cur_pos): # 向下判断
    if (cur_pos * 2 + 1 > len(li) - 1 or li[cur_pos] > li[cur_pos * 2 + 1]) and (
        cur_pos * 2 + 2 > len(li) - 1 or li[cur_pos] > li[cur_pos * 2 + 2]
    ):
        return True
    return False


def tree_judge(li):
    for i in range(len(li) - 1, 0):
        if li[i] > li[int(i - 1) // 2]:
            return False
    return True


def single_adjust(li, inode): # 单个节点的调整
    cur_pos = inode
    if judge(li, cur_pos) == False:
        if cur_pos * 2 + 2 > len(li) - 1:
            li[cur_pos], li[cur_pos * 2 + 1] = li[cur_pos * 2 + 1], li[cur_pos]
            cur_pos = cur_pos * 2 + 1
        elif li[cur_pos * 2 + 2] > li[cur_pos * 2 + 1]:

            li[cur_pos], li[cur_pos * 2 + 2] = li[cur_pos * 2 + 2], li[cur_pos]
            cur_pos = cur_pos * 2 + 2
        else:
            li[cur_pos], li[cur_pos * 2 + 1] = li[cur_pos * 2 + 1], li[cur_pos]
            cur_pos = cur_pos * 2 + 1
        single_adjust(li, cur_pos)


def total_adjust(li):
    for i in range(len(li) - 1, -1, -1):
        single_adjust(li, i)


def tree2list(treeli, resultli): # 从大根堆(列表)获取降序列表
    original_list = treeli
    while original_list:
        resultli.append(original_list[0])
        original_list[0] = original_list[-1]
        del original_list[-1]
        single_adjust(original_list, 0)


n = int(input("input tree node number:"))
testtree = [x for x in range(n)]
random.shuffle(testtree)
result_list = []
# print(testtree)

total_adjust(testtree)
printf_tree(testtree)

tree2list(testtree, result_list)
print(result_list)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值