本文共 1725 字,大约阅读时间需要 5 分钟。
堆排序详解:从代码到实践
堆排序是一种高效的排序算法,通过不断从堆顶取出最大值并调整剩余堆的结构,最终完成对整个数据集的排序。以下将从代码实现入手,详细阐述堆排序的工作原理。
堆排序的核心思想可以总结为以下几个步骤:
这种方法的时间复杂度为O(n log n),在数据量较大时表现尤为出色。
以下是基于Python的堆排序实现代码:
dataset = [16, 9, 21, 3, 13, 14, 23, 6, 4, 11, 3, 15, 99, 8, 22]for i in range(len(dataset)-1, 0, -1): # 打印当前处理的数据段 print("-------", dataset[0:i+1], len(dataset), i) # 重建最大堆 for index in range(int((i+1)/2), 0, -1): p_index = index l_child_index = 2 * p_index - 1 r_child_index = 2 * p_index # 打印子节点索引 print("l index", l_child_index, "r index", r_child_index) p_node = dataset[p_index - 1] left_child = dataset[l_child_index] # 交换父节点与左子节点 if p_node < left_child: dataset[p_index - 1], dataset[l_child_index] = left_child, p_node p_node = dataset[p_index - 1] # 交换父节点与右子节点 if r_child_index < len(dataset[0:i+1]): right_child = dataset[r_child_index] if p_node < right_child: dataset[p_index - 1], dataset[r_child_index] = right_child, p_node p_node = dataset[p_index - 1] else: print("p node [%s] has no right child" % p_node) # 将最大值移动到末尾 print("switch i index", i, dataset[0], dataset[i]) dataset[0], dataset[i] = dataset[i], dataset[0] print("before switch", dataset[0:i+1]) print(dataset) dataset列表中通过上述代码,可以看到每一步的操作结果。例如,当处理到i=7时,数据集的前8个元素会被重新排列,最大值会被移动到末尾。
堆排序通过不断重建最大堆的特性,实现了高效的排序过程。通过上述代码和详细解释,读者可以清晰地理解堆排序的工作原理及其实现方式。
转载地址:http://vnofk.baihongyu.com/