堆排序python实现_Python实现堆排序的方法详解

本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下:

堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序算法,除了输入数组以外只占用常数个元素空间。

堆(定义):(二叉)堆数据结构是一个数组对象,可以视为一棵完全二叉树。如果根结点的值大于(小于)其它所有结点,并且它的左右子树也满足这样的性质,那么这个堆就是大(小)根堆。

我们假设某个堆由数组A表示,A[1]为树的根,给定某个结点的下标i,其父结点、左孩子、右孩子的下标都可以计算出来:

PARENT(i):

return i/2

LEFT(i):

return 2i

RIGHT(i):

return 2i+1

堆排序Python实现

所谓堆排序的过程,就是把一些无序的对象,逐步建立起一个堆的过程。

下面是用Python实现的堆排序的代码:

def build_max_heap(to_build_list):

"""建立一个堆"""

# 自底向上建堆

for i in range(len(to_build_list)/2 - 1, -1, -1):

max_heap(to_build_list, len(to_build_list), i)

def max_heap(to_adjust_list, heap_size, index):

"""调整列表中的元素以保证以index为根的堆是一个最大堆"""

# 将当前结点与其左右子节点比较,将较大的结点与当前结点交换,然后递归地调整子树

left_child = 2 * index + 1

right_child = left_child + 1

if left_child < heap_size and to_adjust_list[left_child] > to_adjust_list[index]:

largest = left_child

else:

largest = index

if right_child < heap_size and to_adjust_list[right_child] > to_adjust_list[largest]:

largest = right_child

if largest != index:

to_adjust_list[index], to_adjust_list[largest] = \

to_adjust_list[largest], to_adjust_list[index]

max_heap(to_adjust_list, heap_size, largest)

def heap_sort(to_sort_list):

"""堆排序"""

# 先将列表调整为堆

build_max_heap(to_sort_list)

heap_size = len(to_sort_list)

# 调整后列表的第一个元素就是这个列表中最大的元素,将其与最后一个元素交换,然后将剩余的列表再调整为最大堆

for i in range(len(to_sort_list) - 1, 0, -1):

to_sort_list[i], to_sort_list[0] = to_sort_list[0], to_sort_list[i]

heap_size -= 1

max_heap(to_sort_list, heap_size, 0)

if __name__ == '__main__':

to_sort_list = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]

heap_sort(to_sort_list)

print to_sort_list

希望本文所述对大家Python程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值