Python堆排序详解

利用大顶堆实现排序——Python算法详解

堆排序原理详解:

在计算机科学中,heapsort是一种基于比较的
排序算法。Heapsort可以被认为是一种改进的选择排序:像该算法一样,它将输入分为排序区域和未排序区域,并通过提取最大元素并将其移动到排序区域来迭代缩小未排序区域。改进包括使用堆数据结构而不是线性时间搜索来找到最大值。

来源:https://en.wikipedia.org/wiki/Heapsort

时间复杂度nlogn

代码及详细注释

'''
    1、堆排序由两个函数组成:
        构建堆、堆顶抽取(实现排序)
    2、构建堆:
        关键参数index:表示建堆的初始索引位置。
        满足以下两个条件时,产生递归调用:
            当index不在叶节点的第一级父节点
            当index不是一家子(父节点,左、右孩子节点)里最大值,存在位置交换时
        递归调用时自顶向下的过程。
        关键参数heap_size:建堆的最大尺寸,在排序替换过程中起限定作用,已经有序的部分不需要再建堆
'''

def heapify(unsorted, index, heap_size):
    largest = index
    left_index = 2 * index + 1
    right_index = 2 * index + 2
    if left_index < heap_size and unsorted[left_index] > unsorted[largest]:
        largest = left_index
	#若改为 unsorted[left_index] < unsorted[largest] 即为小顶堆,实现由大到小排序
    if right_index < heap_size and unsorted[right_index] > unsorted[largest]:
        largest = right_index

    if largest != index:
        unsorted[largest], unsorted[index] = unsorted[index], unsorted[largest]
        heapify(unsorted, largest, heap_size)

def heap_sort(unsorted):
    '''
        堆排序函数核心是:
            对建堆过程的调用
    '''
    n = len(unsorted)
    for i in range(n // 2 - 1, -1, -1):
        heapify(unsorted, i, n)  #自底向上建堆
    for i in range(n - 1, 0, -1):  #堆顶元素互换
        unsorted[0], unsorted[i] = unsorted[i], unsorted[0] #位置互换
        heapify(unsorted, 0, i)  #自堆顶建堆
        #需注意建堆起始位置为0,堆形状为i,即建堆的规模逐步缩小。已经有序的部分不需要再改动
    return unsorted

if __name__ == '__main__':
    try:
        raw_input          # Python 2
    except NameError:
        raw_input = input  # Python 3

    user_input = raw_input('Enter numbers separated by a comma:\n').strip()
    unsorted = [int(item) for item in user_input.split(',')]
    print(heap_sort(unsorted))

建堆过程中的函数调用

输入数组为[1,5,2,3,6,4,7]
建堆过程如下图所示:
Python堆排序详解_第1张图片
替换首位位置,后重新建堆。示意图略。

你可能感兴趣的:(Python)