数据结构:堆排序算法,详解,图解 -- 数据结构算法集

堆排序算法

  • 折半/二分查找算法
  • 冒泡排序算法
  • 插入排序算法
  • 选择排序算法
  • 快速排序算法
  • 希尔排序算法
  • 堆排序算法
  • 归并排序算法

1、堆定义:

堆被看作是一个完全二叉树的数组对象,
满足条件

  1. 是一个完全二叉树,
  2. 每个小堆的父节点总是大于等于或者小于等于子节点。

大根堆:根节点最大的堆,升序排列构建大根堆。
小根堆:根节点最小的堆,降序排列构建小根堆。

大根堆和小根堆图:

蓝色的数字是该元素在list列表中的下标位置
数据结构:堆排序算法,详解,图解 -- 数据结构算法集_第1张图片

这里以升序的堆排列作为讲解,

2、基本思想及步骤:

  1. 首先构建堆,将一个无序列表构建成一个大根堆。
  2. 将顶端的元素与末尾元素n进行交换,此时末尾元素即为最大值,剩下的待排列元素为n-1。
  3. 将剩下的n-1元素在进行构建大根堆,将顶端元素与n-1位置的元素进行交换,即得到n-1位置元素为第二大值,
  4. 重复执行上面步骤,即可得到有序排列。

根据索引节点i计算,i为元素下标
父节点:(i - 1) // 2
左子节点:2i + 1
右子节点:2i + 2

3、代码实现

python2.7.5

# _*_encoding:utf-8_*_


# 构建大根堆
def heapify_model(lists, index, length):
	'''
	lists:序列
	index:父节点下标
	length:list进行堆构建的最大长度范围,超出的元素不参与堆构建
	'''
	# length = len(lists)
	left = 2 * index + 1		# 左子节点下标
	right = 2 * index + 2		# 右子节点下标
	maxindex = index 			# 默认父节点最大
	# 左子节点大于最大节点,则替换最大节点
	if length > left and lists[left] > lists[maxindex]:
		maxindex = left
	# 右子节点大于最大节点,则替换最大节点
	if length > right and lists[right] > lists[maxindex]:
		maxindex = right
	# 判断父节点是否被替换,替换了说明父节点不是最大值,需要进行换位置
	if maxindex != index:
		# 替换父节点
		lists[maxindex], lists[index] = lists[index], lists[maxindex]
		# 递归,因为子节点与父节点进行了替换,所以要对子节点下面的堆进行调整,
		heapify_model(lists,maxindex,length)


# 堆排序算法
def heapify_sort(lists):
	length = len(lists)
	# 首先需要构建大根堆,
	# 构建大根堆需要从最后一个非叶子节点开始,从右至左,从下至上构建大根堆,调整架构
	# 第一个非叶子节点的下标 length // 2 - 1,这里的堆是从下标0开始排列,
	for i in range(length // 2 - 1,-1,-1):		# 倒序,从右至左,从下至上
		heapify_model(lists,i,length)
	# --- 大根堆构建完成 ---
	# 元素下沉构建大根堆
	for j in range(0,length):
		# 首元素(最大值)与最后一个元素换位置,
		# 第m大的元素与lenght - m 换位置
		# 这里是第一个最大值从下标0开始,所以要再减一
		model_len = len(lists) - j - 1
		lists[0], lists[model_len] = lists[model_len], lists[0]
		# 换位置后lists最后一个元素即为最大值,
		# 则再进行构建大根堆的时候,排除后面j + 1位,因为后面的j + 1 位元素已为有序排列
		
		for k in range(model_len // 2 - 1,-1,-1):		# 倒序,从右至左,从下至上
			heapify_model(lists,k,model_len)

	return lists



lt = [5,0,2,4,10,9,1]
print heapify_sort(lt)

结果
在这里插入图片描述


参考:
https://www.cnblogs.com/liuqiyun/p/9415003.html

你可能感兴趣的:(数据结构与算法,python)