堆排序(Python)

本文介绍了堆排序这种效率为O(nlogn)的不稳定排序算法。堆排序通过构建大根堆,依次取出堆顶元素并重构堆来完成排序。详细步骤包括建立堆、交换堆顶元素和重新调整堆。提供的Python代码展示了堆排序的完整实现过程。
摘要由CSDN通过智能技术生成
堆排序
  • 不稳定排序,时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

堆排序的特点是利用了数据结构中的堆。
堆是一种完全二叉树,将根节点大的堆叫做大根堆,根节点小的堆叫做小根堆。这里我用大根堆来进行演示,如下图所式,就是一个大根堆。
在这里插入图片描述

步骤:

  • 首先取出根结点7
  • 将4移动到7原来的位置,重新构造堆
  • 然后再取出根结点的数字,再重新构造堆,依次进行,直到堆变空为止,排序完成。
实现代码
def heapify(tree,n,i):
	# 对堆的第i个结点,进行重构堆
	c1 = 2*i + 1 # 第i个结点的子结点1
	c2 = 2*i + 2 # 第i个结点的子结点2
	max_index = i # 假设根结点i的值是最大的
	
	while c1 < n and tree[max_index] < tree[c1]: # 如果子结点的值 大于 根结点的值,则将子结点的下标 置成最大下标
		max_index = c1
	while c2 < n and tree[max_index] < tree[c2]:
		max_index = c2
	if i != max_index:
		tree[max_index],tree[i] = tree[i],tree[max_index]
		heapify(tree,n,max_index)

def build_heap(tree,n):
	# 对一个列表 按照 大根堆 进行排列
	last_node = n-1 # 最后一个结点
	p = int((last_node-1)/2) # last_node的父结点
	for i in range(p,-1,-1):
		heapify(tree,n,i) # 从下往上,依次对结点,按照堆的顺序排列
		
def heap_sort(tree,n):
	build_heap(tree,n)
	for i in range(n-1,-1,-1):
		tree[i],tree[0] = tree[0],tree[i] # 将 根结点 取出
		heapify(tree,i,0) # 对 根结点 重构堆

if __name__ == "__main__":
	arr = [15,8,32,42,25,41]
	heap_sort(arr,len(arr))
	print("排序之后:",arr)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
堆排序是一种基于二叉堆数据结构的排序算法。下面是一个用Python实现的堆排序示例代码: ```python def heapify(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heapSort(arr): n = len(arr) # 构建最大堆 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 逐个从堆中取出元素并进行排序 for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] # 将当前最大元素移动到数组末尾 heapify(arr, i, 0) return arr # 测试代码 arr = [12, 11, 13, 5, 6, 7] sorted_arr = heapSort(arr) print("排序后的数组:") print(sorted_arr) ``` 这段代码首先定义了两个函数,`heapify`函数用于维护最大堆的性质,`heapSort`函数则是通过调用`heapify`函数实现堆排序。 在`heapify`函数中,首先找到当前节点及其左右子节点中的最大值,并将最大值与当前节点交换位置,然后递归调用`heapify`函数来修复子树。 在`heapSort`函数中,首先构建初始最大堆,然后将堆顶元素(最大值)与末尾元素交换位置,并修复堆的性质。重复这个步骤直到堆为空,此时排序完成。 运行以上代码,将得到输出结果: ``` 排序后的数组: [5, 6, 7, 11, 12, 13] ``` 这就是使用堆排序算法对给定数组进行排序的过程。希望对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值