python算法实现系列-堆排序

    最近在学习排序算法,正好打算练习一下自己前段时间自学的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。 交换堆顶与未经排序的最后一个元素的值(由于堆顶的值是大顶堆中的最大值,这样我们不断将当前堆的最大值放置到当前最后一个元素中), 并将除最后一个元素之后的所有元素重新构成大顶堆。 持续以上过程。

猜你喜欢

转载自blog.csdn.net/u010846934/article/details/21462775
今日推荐