📜  何时使用每种排序算法

📅  最后修改于: 2021-04-24 16:13:05             🧑  作者: Mango

排序算法是按一定顺序排列的算法。基本任务是按所需顺序放置项目,以便重新排列记录以使搜索更容易。
以下是对何时使用哪种排序算法以获得更好性能的逐个说明-

  1. 选择排序–
    这种排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序。该算法在给定数组中维护两个子数组,即已排序的子数组和未排序的其余子数组。在选择排序的每次迭代中,都会从未排序的子数组中选取最小元素(考虑升序)并将其移至已排序的子数组。

    我们可以按照以下约束使用选择排序:

    • 当列表很小时。由于选择排序的时间复杂度为O(N 2 ) ,因此对于大型列表而言效率低下。
    • 当内存空间有限时,因为它使排序期间的交换尽可能少。
  2. 气泡排序–
    此排序算法是最简单的排序算法,它可以通过以错误顺序重复交换相邻元素来工作。如果我们总共有N个元素,则需要将上述过程重复N-1次。

    我们可以按照以下约束使用冒泡排序:

    • 它适用于几乎对项目进行排序的大型数据集,因为只需一次迭代即可检测列表是否已排序。但是,如果列表未进行大范围的排序,则此算法适用于小型数据集或列表。
    • 对于极少或几乎排序的数据集,此算法最快。
  3. 插入排序–
    这种排序算法是一种简单的排序算法,其工作方式与我们手中对扑克牌的排序方式相同。在每次迭代中,它将未排序的元素放置在其合适的位置。

    我们可以按照以下约束使用插入排序:

    • 如果数据接近排序或列表较小(因为复杂度为O(N 2 )),并且列表已排序,则最小数量的元素将滑过以将元素插入到正确的位置。
    • 该算法是稳定的,并且在列表几乎被排序时具有快速运行的情况。
    • 内存的使用是一个约束,因为它的空间复杂度为O(1)。
  4. 合并排序–
    该排序算法基于分而治之算法。它将输入数组分为两个半部分,将自身称为两个半部分,然后合并两个已排序的半个部分。
    merge()函数用于合并两个半部分。 merge(arr,l,m,r)是一个关键过程,假定对arr [l..m]arr [m + 1..r]进行排序并将两个排序后的子数组合并为一个。

    我们可以按照以下约束使用合并排序:

    • 当数据结构不支持随机访问时使用合并排序,因为它与作为转发迭代器的纯顺序访问(而不是随机访问迭代器)一起使用。
    • 它广泛用于外部排序,在这种情况下,与顺序访问相比,随机访问可能非常非常昂贵。
    • 在已知数据是相似数据的地方使用它。
    • 在链接列表的情况下,合并排序速度很快。
    • 在链表的情况下,它用于链表中,以访问我们需要从头到该索引的某个索引处访问任何数据,并按顺序合并排序访问数据,因此对随机访问的需求较低。
    • 合并排序的主要优点是它的稳定性,相比而言,这些元素同样保留其原始顺序。
  5. 快速排序–
    该排序算法也基于分而治之算法。它选择一个元素作为枢轴,并围绕所选择的枢轴对给定列表进行分区。在基于枢轴元素对列表进行分区之后,将Quick再次递归应用于两个子列表,即,枢轴元素左侧的子列表和枢轴元素右侧的子列表。

    我们可以按照以下约束条件使用“快速排序”:

    • 快速排序最快,但并不总是O(N * log N) ,因为在最坏的情况下,它变为O(N 2 )
    • 对于存储在内存中的数据集,Quicksort可能更有效。对于较大的数据集,事实证明效率不高,因此在这种情况下,最好使用诸如合并排序之类的算法。
    • 快速排序是一种就地排序(即不需要任何额外的存储空间),因此适合将其用于数组。