堆排序python实现_迭代子列表堆排序python实现

I've found different versions of heap sort for python, but I can't seem to find the one that matches my needs.

Iterative Heap Sort is the closest I found,

but I can't quite figure out how to change it to work with a sub-list

(index start, index end) and remain in place.

If I get it right then I'll post my answer here.

If anyone has an implementation in even C or Java that will be great.

解决方案

I managed to do what I want.

This code works on objects and sorts by a specific attribute.

def buildMaxHeap(arr, arrayLength, indexStart, attr):

for i in range(arrayLength):

# if child is bigger than parent

if getattr(arr[indexStart + i], attr) > getattr(arr[indexStart + int((i - 1) / 2)], attr):

j = i

# swap child and parent until

# parent is smaller

while getattr(arr[indexStart + j], attr) > getattr(arr[indexStart + int((j - 1) / 2)], attr):

(arr[indexStart + j],

arr[indexStart + int((j - 1) / 2)]) = (arr[indexStart + int((j - 1) / 2)], arr[indexStart + j])

j = int((j - 1) / 2)

def heapSort(arr, arrayLength, indexStart, attr):

buildMaxHeap(arr, arrayLength, indexStart, attr)

for i in range(arrayLength - 1, 0, -1):

# swap value of first indexed

# with last indexed

arr[indexStart + 0], arr[indexStart + i] = arr[indexStart + i], arr[indexStart + 0]

# maintaining heap property

# after each swapping

j, index = 0, 0

while True:

index = 2 * j + 1

# if left child is smaller than

# right child point index variable

# to right child

if (index < (i - 1) and getattr(arr[indexStart + index], attr) < getattr(arr[indexStart + index + 1], attr)):

index += 1

# if parent is smaller than child

# then swapping parent with child

# having higher value

if index < i and getattr(arr[indexStart + j], attr) < getattr(arr[indexStart + index], attr):

arr[indexStart + j], arr[indexStart + index] = arr[indexStart + index], arr[indexStart + j]

j = index

if index >= i:

break

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值