Python 中 Hoare 的 vs. Lomuto 分区方案在 QuickSort 中的应用2024 年 8 月 29 日 | 阅读 6 分钟 排序是计算机科学中的一项主要活动,而 QuickSort 由于这个原因是一个极其高效的算法。本文将探讨 QuickSort 的概念,包括 Python 中的随机枢轴选择。我们将从 QuickSort 的介绍开始,深入探讨其关键组成部分。 什么是 QuickSort?QuickSort 是一种著名的排序算法,属于基于比较的排序类别。它由 Tony Hoare 于 1960 年创建,以其速度和简洁性而闻名。它的工作原理是选择数组中的一个“枢轴”元素,并将其他元素分成两个子数组:小于枢轴的元素和大于枢轴的元素。然后递归地将该过程应用于子数组,直到整个数组排序完毕。 随机枢轴选择枢轴元素的选取对 QuickSort 的性能影响极大。传统的 QuickSort 实现经常选择第一个或最后一个元素作为枢轴。但是,在某些情况下,例如输入数据已排序时,这种方法可能导致性能下降。这就是随机枢轴选择发挥作用的地方。 使用 Hoare 分区进行随机枢轴选择Hoare 分区是 QuickSort 的一种替代分区方案,与 Lomuto 分区相比,它在交换方面效率更高。以下是一个使用 Hoare 分区和随机枢轴选择实现 QuickSort 的 Python 程序。 算法
代码 输出 Original Array : [3, 6, 8, 10, 1, 2, 1] Sorted Array based on Hoare Partitioning : [1, 1, 2, 3, 6, 8, 10] 时间复杂度:使用 Hoare 分区的 QuickSort 的平均时间复杂度为 O(n log n),最坏情况时间复杂度为 O(n^2)。 空间复杂度:由于递归函数调用和使用的堆栈空间,空间复杂度为 O(log n),其中 'n' 是数据数组中的元素数量。 使用 Lomuto 分区进行随机枢轴选择随机枢轴选择涉及选择一个随机元素作为枢轴。这种随机性降低了遇到最坏情况的可能性,并确保 QuickSort 在各种数据分布下都具有效率。以下是一个使用 Lomuto 分区和随机枢轴选择实现 QuickSort 的 Python 程序。 算法
代码 输出 Original Array : [3, 6, 8, 10, 1, 2, 1] Sorted Array based on Lomuto Partitioning : [1, 1, 2, 3, 6, 8, 10] 时间复杂度:使用 Lomuto 分区的 QuickSort 的最坏情况时间复杂度为 O(n^2),平均时间复杂度为 O(n log n),最佳情况时间复杂度为 O(n log n)。 空间复杂度:此实现的内存复杂度为 O(n),因为递归函数调用,其中 'n' 是数据数组中的元素数量。 比较Lomuto 分区由于其简单性而更易于实现和理解。Lomuto 分区是稳定的,这意味着它保留了相等元素的相对顺序。Lomuto 分区比 Hoare 分区需要更多的交换,因此在内存操作方面效率较低。通常,它的性能比 Hoare 分区稍慢。 Hoare 分区在时间和交换方面效率更高,因此在实践中更快。Hoare 分区不稳定,可能会改变相等元素的顺序。与 Lomuto 分区相比,Hoare 分区的理解和实现更为复杂。
结论总之,具有随机枢轴选择的 QuickSort 是一种强大的排序方法,具有多种分区选择,其中 Lomuto 和 Hoare 是两个明显的选择。这两种方法都利用了枢轴选择的随机性来提高 QuickSort 在各种数据场景下的性能和适应性。提供的 Python 程序以及详细的注释,为有兴趣在项目中探索和实现这些算法的人们提供了一个全面的资源。 |
在 Python 中,与使用其他编程语言相比,转换元素非常容易。在本教程中,我们将讨论将十六进制字符串转换为十进制字符串的不同方法。方法 1:通过使用 int() 函数 int() 函数用于执行这些类型的任务,其...
阅读 3 分钟
在本教程中,我们将解决 Python 问题,其中我们需要找到排序数组中元素的第一个和最后一个位置。问题陈述是我们给出了一个按非递减顺序排序的整数数组,并找到...
阅读 6 分钟
由于 Python 加速了交易过程,这种方法被称为自动化交易或量化交易。Python 的流行归因于其强大的库,如 Pyplot、TA-Lib、Scipy、NumPy、Zipline、Matplotlib、Pandas 等。什么是自动化交易?自动化交易通过执行预设的程序来接受和...
阅读 13 分钟
? 省略号是英语文本中用于表示省略的标点符号。本质上,您用三个点 (...) 替换内容。然而,您可能已经在 Python 源代码中注意到三个点。省略号不仅仅用于写作。Python 中的省略号……
阅读 8 分钟
Pandas 的 read_clipboard() 技术可以从复制到剪贴板的信息中创建一个 DataFrame。它从剪贴板中读取文本并将其传递给 read_csv(),然后后者返回一个已解析的 DataFrame 对象。这个方法,恰如其分地命名为 read_clipboard,当你...
11 分钟阅读
银行账号是金融机构用于识别特定账户的唯一标识符。验证银行账号对于确保金融交易的准确性和效率至关重要。本文将讨论如何使用……验证银行账号。
阅读 3 分钟
C 与 C++ 与 Python 与 Java 程序已成为我们日常生活中不可或缺的一部分。一切现在都通过物联网数字化和连接。C、C++、Java 和 Python 在大多数流行编程语言排行榜中仍然名列前茅...
7 分钟阅读
先决条件:Python 中的循环,Python 中的跳转语句 - break continue 语句是第二个跳转语句,它为我们提供循环控制。在本文中,我们将学习 continue 语句的功能和重要性。我们之前讨论过 break 语句。它终止整个循环...
5 分钟阅读
(使用 BeautifulSoup 进行数据抓取) Web 抓取是从网站提取数据的一种方式。它有助于我们收集或复制特定数据,我们可以将数据存储到数据库或电子表格中以供以后分析或检索。Python 附带 BeautifulSoup……
7 分钟阅读
网络安全中的人工智能正在彻底改变我们抵御黑帽黑客和恶意黑客的方式。在网络安全方面采取专注的策略非常重要。从技术角度来看,采取全面的安全方法非常重要,其中...
11 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India