堆排序

import random

def generate_big_root_heap(li,low,hight):
    i = low
    j = 2 * i + 1
    tmp = li[i]
    while j <= hight:
        if j + 1 <= hight and li[j+1] > li[j]:
            j = j + 1
        if li[j] > tmp:
            li[i] = li[j]
            i = j
            j = 2 * i + 1
        else:
            break
    li[i] = tmp

def generate_low_root_heap(li,low,hight):
    i = low
    j = 2 * i + 1
    tmp = li[low]
    while j <= hight:
        if j + 1 <= hight and li[j+1] < li[j]:
            j = j + 1
        if li[j] < tmp:
            li[i] = li[j]
            i = j
            j = 2 * i + 1
        else:
            break
    li[i] = tmp

def heap_sort(li):
    n = len(li)
    # 建堆
    for i in range((n-1-1)//2,-1,-1):
        # generate_big_root_heap(li,i,n-1)    # 大根堆
        generate_low_root_heap(li,i,n-1)    # 小根堆
    print(li)
    # 堆向下调整
    for i in range(n-1,-1,-1):
        li[i], li[0] = li[0], li[i]
        # generate_big_root_heap(li,0,i-1)    # 大根堆
        generate_low_root_heap(li,0,i-1)    # 小根堆


def main():
    li = [i for i in range(100)]
    random.shuffle(li)
    print(li)
    heap_sort(li)
    print(li)

if __name__ == '__main__':
    main()

  

posted @ 2021-11-20 12:02  NAVYSUMMER  阅读(54)  评论(0编辑  收藏  举报
交流群 编程书籍