最近在学习排序算法,正好打算练习一下自己前段时间自学的python基础,就用python来实现这些算法。
本文实现堆(大顶堆)排序,代码如下:
def heap_adjust(data, s, m):
temp = data[s]
j = 2 * s + 1
while j < m:
if j < m - 1 and data[j] < data[j + 1]:
j += 1
if temp > data[j]:
break
data[s] = data[j]
s = j
j = 2 * s + 1
data[s] = temp
def heap_sort(data):
m = len(data) / 2 - 1
for i in range(m, -1, -1):
heap_adjust(data, i, len(data) - 1)
for n in range(len(data) - 1, 0, -1):
data[0], data[n] = data[n], data[0]
heap_adjust(data, 0, n)
print data
思路简记如下:
heap_adjust: s..m中的数除s外其他的已经构成大顶堆, 此处要加入s使其依然构成大顶堆。s与其两个孩子结点比较,如果其不大于两个孩子结点中的较大值,则交换二者的值。 对于交换后的新的孩子结点继续如上过程。直到结束。
heap_sort: 将所有有孩子的结点执行heap_adjust。 交换堆顶与未经排序的最后一个元素的值(由于堆顶的值是大顶堆中的最大值,这样我们不断将当前堆的最大值放置到当前最后一个元素中), 并将除最后一个元素之后的所有元素重新构成大顶堆。 持续以上过程。