利用大顶堆实现排序——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]
建堆过程如下图所示:
替换首位位置,后重新建堆。示意图略。