在过去的6个小时里,我一直在阅读关于构建一个堆的教程和学术资料。我终于在python中对原型进行了原型化,对整数列表进行了排序。但是,我不完全确定我的解决方案是否构成有效的堆。这是一个非常简单的解决方案,绝对可以改进,但我想知道它是否有效。令人困惑的是,每个人似乎都有自己的'首选'方式来实现这个算法。
非常感谢提前。
def heapsort(array):
array = heapify(array)
array = insert(array, 9999)
print(array)
def heapify(array):
end = len(array)
i = 0
j = 0
while i < end:
while j < end:
if array[i] > array[j]:
array = swap(array, i, j)
j += 1
i += 1
j = i
return array
def insert(array, x):
array.append(x)
return heapify(array)
def swap(array, a, b):
temp = array[a]
array[a] = array[b]
array[b] = temp
return array
def main(array):
heapsort(array)
if __name__ == '__main__':
array = [3, 1, 2, 4, 6, 7, 9, 0]
main(array)
答案 0 :(得分:2)
您的heapify()应该比较堆内的父/子元素(树结构)。它们在阵列中的相对位置是
ChildIndex = 2 * Parent Index + [0|1] # two children per parent
就数组的索引而言。这在您的实施中并不明显。
答案 1 :(得分:2)
您所写的内容似乎是Selection Sort。
堆排序将数组排列成堆(最简单的是二进制堆),即堆 其中找到最小元素的时间是O(1)并且去除最小元素的结构是O(log n)并且元素的插入也是O(log n)。然后,它重复获取最小元素以生成排序顺序。