Python 堆排序
本篇文章将介绍堆排序算法在 Python 中的实现。
Python中的堆排序算法
堆排序是一种强大的算法,用于在 Python 中对数组和列表进行排序。 它很受欢迎,因为它非常快,并且不像合并排序和快速排序那样占用任何额外空间。
堆排序的时间复杂度是O(n*log(n))
。
堆排序是一种就地算法,它不再创建任何数据结构来保存数据的中间状态。 相反,它对我们的原始数组进行了更改。
因此,当数据非常大时,这为我们节省了大量空间。
该算法唯一的缺点是它非常不稳定。 如果我们的数组中有多个元素在不同索引处具有相同的值,则它们的位置将在排序时发生变化。
堆排序算法的工作原理是递归地创建一个最小或最大堆,取出根节点,将其放在我们数组中的第一个未排序索引处,并将最后一个堆元素转换为根节点。
这个过程递归重复,直到我们在堆中留下一个节点。 最后,最后一个堆元素被放置在我们数组的最后一个索引处。
如果我们想一想,这个过程类似于选择排序算法,因为我们取最大值或最小值并将它们放在已排序数组的顶部。
在 Python 中实现堆排序算法
我们将首先了解实现 build_heap() 函数,该函数采用原始数组、数组的长度和父节点的索引。 在这里,如果我们查看一个数组,最后一个父节点的索引位于我们数组内的 (n//2 - 1) 处。
类似地,该特定父级的左孩子的索引为 2*parent_index + 1
,右孩子的索引为 2*parent_index + 2
。
在这个例子中,我们试图创建一个最大堆。 这意味着每个父节点都需要大于其子节点。
为此,我们将从最后一个父节点开始,向上移动到堆的根节点。 如果我们想创建一个最小堆,我们希望所有父节点都小于它们的子节点。
此 build_heap()
函数将检查左或右子节点是否大于当前父节点,并将最大节点与父节点交换。
该函数递归地调用自身,因为我们希望对堆中的所有父节点递增地重复之前的过程。
以下代码片段演示了上述 built_heap() 函数在 Python 中的有效实现。
def build_heap(arr, length, parent_index):
largest_index = parent_index
left_index = 2 * parent_index + 1
right_index = 2 * parent_index + 2
if left_index < length and arr[parent_index] < arr[left_index]:
largest_index = left_index
if right_index < length and arr[largest_index] < arr[right_index]:
largest_index = right_index
if largest_index != parent_index:
arr[parent_index],arr[largest_index] = arr[largest_index],arr[parent_index]
build_heap(arr, length, largest_index)
现在,我们有一个函数,它获取数组中的最大值并将其放在堆的根部。 我们需要一个函数来获取未排序的数组,调用 build_heap()
函数并从堆中提取元素。
以下代码片段演示了 heapSort()
函数在 Python 中的实现。
def heapSort(arr):
length = len(arr)
for parent_index in range(length // 2 - 1, -1, -1):
build_heap(arr, length, parent_index)
for element_index in range(length-1, 0, -1):
arr[element_index], arr[0] = arr[0], arr[element_index]
build_heap(arr, element_index, 0)
我们在数组中逐步调用每个父节点的 build_heap()
函数。 请注意,我们将 length//2-1 作为起始索引,-1 作为结束索引,步长为 -1。
这意味着我们从最后一个父节点开始,递减索引 1,直到到达根节点。
第二个 for 循环从我们的堆中提取元素。 它也从最后一个索引开始,并在我们数组的第一个索引处停止。
我们在此循环中交换数组的第一个和最后一个元素,并通过传递 0 作为根索引对新排序的数组执行 build_heap() 函数。
现在,我们已经编写了用 Python 实现堆排序的程序。 是时候对数组进行排序并测试上面编写的代码了。
arr = [5, 3, 4, 2, 1, 6]
heapSort(arr)
print("Sorted array :", arr)
输出:
Sorted array : [1, 2, 3, 4, 5, 6]
如我们所见,我们的数组已完全排序。 这意味着我们的代码工作得很好。
如果我们想按降序排序,我们可以创建一个最小堆而不是上面实现的最大堆。
本文不会解释最小堆,因为它已经在本教程的开头讨论了最小堆是什么。
我们的程序以下列方式工作。 以下块显示了我们的数组在代码执行的每个阶段的状态。
Original Array [5, 3, 4, 2, 1, 6] # input array
Building Heap [5, 3, 6, 2, 1, 4] # after build_heap() pass 1
Building Heap [5, 3, 6, 2, 1, 4] # after build_heap() pass 2
Building Heap [6, 3, 5, 2, 1, 4] # after build_heap() pass 3
Extracting Elements [6, 3, 5, 2, 1, 4] # before swapping and build_heap pass 1
Extracting Elements [5, 3, 4, 2, 1, 6] # before swapping and build_heap pass 2
Extracting Elements [4, 3, 1, 2, 5, 6] # before swapping and build_heap pass 3
Extracting Elements [3, 2, 1, 4, 5, 6] # before swapping and build_heap pass 4
Extracting Elements [2, 1, 3, 4, 5, 6] # before swapping and build_heap pass 5
Sorted array : [1, 2, 3, 4, 5, 6] # after swapping and build_heap pass 5
build_heap()
函数执行了 3 次,因为我们的堆中只有 3 个父节点。
之后,我们的元素提取阶段获取第一个元素,将其与最后一个元素交换,然后再次执行 build_heap()
函数。 对长度 - 1 重复此过程,我们的数组得到排序。
相关文章
Python 拓扑排序
发布时间:2023/06/17 浏览次数:102 分类:Python
-
本篇文章将介绍拓扑排序算法在 Python 中的实现。Python 中的拓扑排序算法 拓扑排序算法对有向无环图 (DAG) 进行排序。
在 Python 中对日期和时间进行排序
发布时间:2023/06/17 浏览次数:82 分类:Python
-
在本文中,我们讨论了如何在 Python 中使用 sorted() 方法对日期和时间进行排序。 为了理解这个概念,我们举了一些例子以及 Python 中的 datetime 模块。
Python 双样本 T 检验
发布时间:2023/06/17 浏览次数:94 分类:Python
-
Python 为我们提供的一个功能是我们可以执行双样本 t 检验。 通过本文,我们将讨论什么是双样本 t 检验以及如何使用 Python 执行它。
在 Python 中生成随机 4 位数字
发布时间:2023/06/17 浏览次数:174 分类:Python
-
本文讨论如何使用 randint() 和 randrange() 方法生成四位数。 此外,我们还讨论了另一种获得随机四位数的方法。
Python中ReLU函数的导数
发布时间:2023/06/16 浏览次数:152 分类:Python
-
就深度学习而言,ReLU 函数在机器学习中使用最频繁。 本文讨论如何在Python中实现ReLU推导以及实现ReLU功能。
计算 Python 中一个句子的平均字长
发布时间:2023/06/16 浏览次数:62 分类:Python
-
本篇文章将介绍用 Python 计算句子中的平均字长。在 Python 中使用 split()、sum() 和 len() 计算句子中的平均字长
Python 中的可选链
发布时间:2023/06/16 浏览次数:80 分类:Python
-
本文描述了我们在适应 Python 中的可选链接时可以遵循的方法。 适应以下方法之一将使在 Python 而不是 JavaScript 中使用可选链接变得容易。
Python中另一个函数调用的模拟补丁一个函数
发布时间:2023/06/16 浏览次数:122 分类:Python
-
本篇文章介绍模拟对象及其重要性,并使用 patch() 作为装饰器、上下文管理器和手动启动/停止来演示如何模拟补丁由另一个函数调用的一个函数。
Python 四舍五入到最接近的十位
发布时间:2023/06/16 浏览次数:124 分类:Python
-
本篇文章将讨论使用 Python 的 ceil() 函数将数字四舍五入到最接近的十。Python 整数到最接近的十 Python 具有三个内置函数 round()、floor() 和 ceil(),可用于对数字进行舍入。