python算法实现系列-堆排序

来源:互联网 发布:贰瓶勉 知乎 编辑:程序博客网 时间:2024/06/05 17:34

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

0 0
原创粉丝点击