python排序-堆排序

思想:

  1. 利用最小堆堆顶为序列最小值,将其与堆尾互换,通过下沉再次得到最小堆,重复

  2. 初始最小(大)堆通过自下向上的判断交换递归得到

  

平均性能

O(N*logN)

其他性能

由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1).
它是不稳定的排序方法。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)

 

Python代码

# -*- coding: utf-8 -*-

def heap(arr):
    # 排序节点
    def node_sort(_arr, _n, _N):
        if _N < 2*_n:
            return
        elif _N == 2*_n:
            if _arr[_n] > _arr[2*_n]:
                _arr[_n], _arr[2*_n] = _arr[2*_n], _arr[_n]
        else:
            min_butree =  2*_n+1 if _arr[2*_n] > _arr[2*_n+1] else 2*_n
            if _arr[_n] > _arr[min_butree]:
                _arr[_n], _arr[min_butree] = _arr[min_butree], _arr[_n]
                node_sort(_arr, min_butree, _N)

    # 初始化得到最大堆
    N = len(arr) - 1
    for i in range(len(arr), 0, -1):
        node_sort(arr, i, N)

    # 堆顶与堆尾交换,下沉后重复得到从大到小排序
    for i in range(N-2):
        arr[1], arr[N-i] = arr[N-i], arr[1]
        node_sort(arr, 1, N-i-1)
    arr[1], arr[2] = arr[2], arr[1]


from random import randint
arr = [-1] + [randint(0, 100) for i in range(20)]
print arr
heap(arr)
print arr

 

posted @ 2016-02-15 22:47  小沙  阅读(1044)  评论(0编辑  收藏  举报