Python堆排序详解

利用大顶堆实现排序——Python算法详解

堆排序原理详解:

在计算机科学中,heapsort是一种基于比较的
排序算法。Heapsort可以被认为是一种改进的选择排序:像该算法一样,它将输入分为排序区域和未排序区域,并通过提取最大元素并将其移动到排序区域来迭代缩小未排序区域。改进包括使用堆数据结构而不是线性时间搜索来找到最大值。

来源:https://en.wikipedia.org/wiki/Heapsort

时间复杂度nlogn

代码及详细注释

'''
    1、堆排序由两个函数组成:
        构建堆、堆顶抽取(实现排序)
    2、构建堆:
        关键参数index:表示建堆的初始索引位置。
        满足以下两个条件时,产生递归调用:
            当index不在叶节点的第一级父节点
            当index不是一家子(父节点,左、右孩子节点)里最大值,存在位置交换时
        递归调用时自顶向下的过程。
        关键参数heap_size:建堆的最大尺寸,在排序替换过程中起限定作用,已经有序的部分不需要再建堆
'''

def heapify(unsorted, index, heap_size):
    largest = index
    left_index = 2 * index + 1
    right_index = 2 * index + 2
    if left_index < heap_size and unsorted[left_index] > unsorted[largest]:
        largest = left_index
	#若改为 unsorted[left_index] < unsorted[largest] 即为小顶堆,实现由大到小排序
    if right_index < heap_size and unsorted[right_index] > unsorted[largest]:
        largest = right_index

    if largest != index:
        unsorted[largest], unsorted[index] = unsorted[index], unsorted[largest]
        heapify(unsorted, largest, heap_size)

def heap_sort(unsorted):
    '''
        堆排序函数核心是:
            对建堆过程的调用
    '''
    n = len(unsorted)
    for i in range(n // 2 - 1, -1, -1):
        heapify(unsorted, i, n)  #自底向上建堆
    for i in range(n - 1, 0, -1):  #堆顶元素互换
        unsorted[0], unsorted[i] = unsorted[i], unsorted[0] #位置互换
        heapify(unsorted, 0, i)  #自堆顶建堆
        #需注意建堆起始位置为0,堆形状为i,即建堆的规模逐步缩小。已经有序的部分不需要再改动
    return unsorted

if __name__ == '__main__':
    try:
        raw_input          # Python 2
    except NameError:
        raw_input = input  # Python 3

    user_input = raw_input('Enter numbers separated by a comma:\n').strip()
    unsorted = [int(item) for item in user_input.split(',')]
    print(heap_sort(unsorted))

建堆过程中的函数调用

输入数组为[1,5,2,3,6,4,7]
建堆过程如下图所示:
在这里插入图片描述
替换首位位置,后重新建堆。示意图略。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值