python 随手写的堆排序

代码

import random


class HeapSorter:
    def __init__(self, arr):
        self.arr = arr

    def heapify(self, size, i):
        p = i
        v = self.arr[i]
        while 2 * p + 1 < size:
            left = 2 * p + 1
            right = 2 * p + 2
            # 二者最大值下标
            if right < size and self.arr[right] > self.arr[left]:
                left = right
            # 不能下沉
            if self.arr[left] <= v:
                break
            self.arr[p] = self.arr[left]
            p = left
        self.arr[p] = v

    def build_heap(self):
        n = len(self.arr)
        # 为什么要循环
        # 为了让父节点一定大于子节点
        # 这样在寻找下一个最大节点的时候不用遍历整个树

        for i in range(n // 2 + 1, -1, -1):
            self.heapify(n, i)

    def sort(self):
        # 保证arr[0]是最大值
        self.build_heap()
        n = len(self.arr)
        for i in range(n - 1, 0, -1):
            # 将最大值移动到数组末尾
            self.arr[i], self.arr[0] = self.arr[0], self.arr[i]
            # 数组大小减1, 寻找下一个最大值
            self.heapify(i, 0)

    def print(self):
        # 因为是最大值在最后面, 所以是升序遍历
        for v in self.arr:
            print(v, end=' ')


arr = []
for i in range(30):
    v = random.randint(0, 100)
    arr.append(v)
sorter = HeapSorter(arr)
sorter.sort()
sorter.print()

输出

在这里插入图片描述

python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序
python 随手写的堆排序

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...