算法系列7—堆排序

堆排序

堆排序:是指利用堆这种数据结构所涉及的一种排序算法。
堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是大于或者小于它的父节点

时间复杂度平均为O(nlog2n),最好为O(nlog2n),最坏O(nlog2n),空间复杂度为O(1),不稳定排序

d0 = [99, 5, 36, 7, 22, 17, 46, 12, 2, 19, 25, 28, 1, 92]


def sort_max(data):  # 直接冒泡一下吧,小到大
    for i in range(len(data) - 1):
        for j in range(len(data) - 1):
            if data[j] > data[j + 1]:
                data[j], data[j + 1] = data[j + 1], data[j]
    return data

def heap_min(data,type):
    index = 0
    if not type:
        for i in range(len(data[1:])):
            if data[index] > data[i+1]:
                index = i+1
        data[0],data[index] = data[index],data[0]
        return data
    else:
        for i in range(len(data[1:])):
            if data[index] < data[i+1]:
                index = i+1
        data[0],data[index] = data[index],data[0]
        return data


# d0 = [3,2,1,10,3]
# print(heap_min(d0,1))
# print(heap_min(d0,0))

import numpy as np


def heap_adj(data, type):  # data 原始堆,type=1最大堆,type=0最小堆
    length = len(data)
    floor = int(np.log2(length))
    for i in range(floor, 0, -1):  # 3(7 6 5 4)-2(3 2)-1(1)
        for j in range(2 ** floor - 1, 2 ** (floor - i) - 1, -1):
            # print(i,j)    # j-1 为当前父节点
            d_mid = [data[j - 1]]  # j = 7,j-1 =6 index
            if j * 2 <= length:  # 14
                d_mid.append(data[j * 2 - 1])
            if j * 2 + 1 <= length:
                d_mid.append(data[j * 2])

            d_mid = heap_min(d_mid, type)

            if len(d_mid) == 2:
                data[j - 1], data[j * 2 - 1] = d_mid[0], d_mid[1]
            elif len(d_mid) == 3:
                data[j - 1], data[j * 2 - 1], data[j * 2] = d_mid[0], d_mid[1], d_mid[2]
    return data

d1 = []
for i in range(len(d0)):
    data = heap_adj(d0, 0)
    d1.append(d0[0])
    del d0[0]


print(d1)

猜你喜欢

转载自blog.csdn.net/qq_42486675/article/details/106456787