堆排序python

堆排序

堆排序是一个近似完全二叉树的结构,利用堆这种数据结构所设计而成的一种排序算法。

堆操作:
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作:
最大堆调整(swap):将堆的末端子节点作调整,使子节点小于父节点
创建最大堆(adjust_heap):将堆中的所有数据重新进行排序
堆排序(heap_sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

下面为堆排序操作示例图:
在这里插入图片描述

#堆排序代码
def swap(data, root, last):
    data[root], data[last] = data[last], data[root]

#调整父节点 与孩子大小, 制作大顶堆
def adjust_heap(data, par_node, high):

    new_par_node = par_node
    j = 2*par_node +1   #取根节点的左孩子, 如果只有一个孩子 high就是左孩子,如果有两个孩子 high 就是右孩子

    while j <= high: #如果 j = high 说明没有右孩子,high就是左孩子
        if j < high and data[j] < data[j+1]: #如果这儿不判断 j < high 可能超出索引
            # 一个根节点下,如果有两个孩子,将 j  指向值大的那个孩子
            j += 1
        if data[j] > data[new_par_node]: #如果子节点值大于父节点,就互相交换
            data[new_par_node], data[j] = data[j], data[new_par_node]
            new_par_node = j #将当前节点,作为父节点,查找他的子树
            j = j * 2 + 1

        else:
            # 因为调整是从上到下,所以下面的所有子树肯定是排序好了的,
            #如果调整的父节点依然比下面最大的子节点大,就直接打断循环,堆已经调整好了的
            break
# 开始循环到 root 索引为:0 的第一个根节点, 将所有的根-叶子 调整好,成为一个 大顶堆
def heap_sort(lst):
    length = len(lst)
    last = length -1  #最后一个元素的 索引
    last_par_node = length//2 -1

    while last_par_node >= 0:

        adjust_heap(lst, last_par_node, length-1)
        last_par_node -= 1  #每调整好一个节点,从后往前移动一个节点

    # return lst

    while last > 0:
        #swap(lst, 0, last)
        lst[0], lst[last] = lst[last],lst[0]
        # 调整堆让 adjust 处理,最后已经排好序的数,就不处理了
        adjust_heap(lst, 0, last-1)
        last -= 1

    return lst #将列表返回
if __name__ == '__main__':
  a=[1,3,4,5,2,6,9,7,8,0]
  print(heap_sort(a))

输出示例结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
堆排序是一种基于二叉堆数据结构的排序算法。下面是一个用Python实现的堆排序示例代码: ```python def heapify(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heapSort(arr): n = len(arr) # 构建最大堆 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 逐个从堆中取出元素并进行排序 for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] # 将当前最大元素移动到数组末尾 heapify(arr, i, 0) return arr # 测试代码 arr = [12, 11, 13, 5, 6, 7] sorted_arr = heapSort(arr) print("排序后的数组:") print(sorted_arr) ``` 这段代码首先定义了两个函数,`heapify`函数用于维护最大堆的性质,`heapSort`函数则是通过调用`heapify`函数实现堆排序。 在`heapify`函数中,首先找到当前节点及其左右子节点中的最大值,并将最大值与当前节点交换位置,然后递归调用`heapify`函数来修复子树。 在`heapSort`函数中,首先构建初始最大堆,然后将堆顶元素(最大值)与末尾元素交换位置,并修复堆的性质。重复这个步骤直到堆为空,此时排序完成。 运行以上代码,将得到输出结果: ``` 排序后的数组: [5, 6, 7, 11, 12, 13] ``` 这就是使用堆排序算法对给定数组进行排序的过程。希望对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值