排序算法的类型(比较、递归、原地)。

212 阅读3分钟

大多数人都知道各种排序算法,甚至它们各自的时间复杂性、最佳情况、最差情况等。然而,他们对排序算法的类型知之甚少。了解这些不同的类型是很重要的,因为它揭示了有关排序算法工作原理的重要信息,以及它的局限性。

我们将讨论的主要有三类。递归和迭代,稳定和非稳定,以及原地和异地。


递归和迭代

排序算法要么是递归性的,要么是迭代性的。

递归。这是当一个函数在它的主体中调用自己时。通常情况下,递归需要额外的内存,因为递归调用会在堆栈内存中堆叠。然而,(大多数)现代编译器也有自动优化功能,可以在编译时将递归代码转换为迭代代码,从而消除了额外的内存问题。递归解决方案由于其简短而有效的排序方式,通常很受欢迎。

**迭代式。**使用常规循环来进行排序。一种相当标准的排序方式。

注意:这是一个相当有争议的话题,在进行的各种测试中,结果差异很大。


原地和非原地

原地排序。在不分配任何额外内存的情况下进行排序,通常是在同一个数组/列表中。通常是通过在同一个数组中交换值来完成。

异地排序。排序算法,在排序时需要额外的内存。它们通常会创建一个新的数组/列表,输出被排序到其中。

一般来说,就地排序算法是首选的类型,因为它的内存需求较低。同时具有递归和就地取材类型的排序算法,对内存的要求最高。

就地外排序算法的例子是合并排序,它创建了一个新的 "结果 "数组,各个元素被排序到其中。原地排序算法的例子是Bubble Sort,它只是在检查两个值是否在排序顺序中之后将它们交换。


稳定的和非稳定的算法

我们要记住的另一件重要事情是,一个排序算法是否稳定。这不能与更常见的稳定用法相混淆,后者意味着一致性。相反,当它应用于排序算法时,其含义略有不同。

让我们考虑以下的数字列表。我们要给它们加上索引号,这样我们就可以区分其中的重复元素。

3  (0)
8  (1)
4  (2)
4  (3)
1  (4)

现在,当我们对这些数字进行排序时,我们可能会得到以下结果。

1  (4)
3  (0)
4  (3)
4  (2)
8  (1)

这里的关键点,是重复的 "4's" 索引位置现在已经被改变了。

另一方面,如果所使用的算法是稳定的,我们最终会得到以下结果。

1  (4)
3  (0)
4  (2)
4  (3)
8  (1)

这对于大多数用例来说可能并不重要,但是如果出现了项目排序时的顺序很重要的情况,你就必须使用一个稳定的排序算法。当我们有 "键对 "格式的数据时,这一点通常很重要,就像上面那个。

大多数算法的 "经典 "版本是不稳定的,但可以被修改为稳定的变体。


如果你想了解更多关于各种排序算法的信息,你可以查看我们的排序算法指南。同样,如果你对所有排序算法之间的比较感兴趣,你可以查看我们的排序算法比较指南。

你也可以查看我们关于排序算法的YouTube系列!


这标志着《排序算法的类型》教程的结束。我们非常欢迎对CodersLegacy的任何建议或贡献。关于教程内容的问题,可以在下面的评论区提出。

The postTypes of Sorting Algorithms (Comparison, Recursive, Inplace)appeared first onCodersLegacy.