Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 插入排序与合并排序哪个更快取决于数组?_Algorithm_Sorting_Complexity Theory_Mergesort_Insertion Sort - Fatal编程技术网

Algorithm 插入排序与合并排序哪个更快取决于数组?

Algorithm 插入排序与合并排序哪个更快取决于数组?,algorithm,sorting,complexity-theory,mergesort,insertion-sort,Algorithm,Sorting,Complexity Theory,Mergesort,Insertion Sort,假设给我们一个数组A,它已经按递增顺序排序。插入排序和合并排序,哪一种无症状地更快 像wise一样,假设我们得到一个按降序排序的数组B,那么它需要反转。现在哪一个无症状地更快 我很难理解这一点,我已经知道插入排序对于较小的数据集更好,合并排序对于较大的数据集更好。但是,我不确定为什么一个比另一个快,这取决于数据集是否已经排序。说到最坏的情况,使用O(N logN)与插入排序的O(N^2)相比,合并排序更快。然而,算法的另一个特征是ω-最佳情况复杂度,即针对合并排序的ω(N logN)插入排序的ω

假设给我们一个数组A,它已经按递增顺序排序。插入排序和合并排序,哪一种无症状地更快

像wise一样,假设我们得到一个按降序排序的数组B,那么它需要反转。现在哪一个无症状地更快


我很难理解这一点,我已经知道插入排序对于较小的数据集更好,合并排序对于较大的数据集更好。但是,我不确定为什么一个比另一个快,这取决于数据集是否已经排序。

说到最坏的情况,使用
O(N logN)
与插入排序的
O(N^2)
相比,合并排序更快。然而,算法的另一个特征是ω-最佳情况复杂度,即针对合并排序的ω(N logN)插入排序的ω(N logN)。
在查看手头的算法时,可以解释后者:

  • 合并排序的工作原理是将数组一分为二(如果可能),递归地对这两半进行排序并合并它们。看看它是如何不依赖于元素的实际顺序的:我们将进行递归调用,而不管我们正在排序的部分是否已经按顺序排序(除非是基本情况)
  • 插入排序查找第一个不符合所需顺序的元素,并将其向左移动,直到其符合顺序为止。如果没有这样的索引,则不会发生移位,算法将完成,只执行
    O(N)
    比较
  • 然而,合并排序是相当固定的w.r.t.最佳运行时间!在进入递归之前,您可以检查手头的零件是否已经排序。这不会改变
    O(N logN)
    的最坏情况复杂度(但是,该常数将加倍),但会将最佳情况复杂度带到
    Omega(N)


    在数据按相反顺序排序的情况下,插入排序的最坏情况将显示出来,因为我们必须将每个元素(按迭代顺序)从其位置移动到第一个位置,进行
    N(N-1)/2
    交换,这属于
    O(N^2)
    。然而,由于其递归方法,合并排序仍然采用
    O(N logN)

    说到最坏的情况,对于插入排序,使用
    O(N logN)
    O(N^2)
    相比,合并排序更快。然而,算法的另一个特征是ω-最佳情况复杂度,即针对合并排序的ω(N logN)插入排序的ω(N logN)。
    在查看手头的算法时,可以解释后者:

  • 合并排序的工作原理是将数组一分为二(如果可能),递归地对这两半进行排序并合并它们。看看它是如何不依赖于元素的实际顺序的:我们将进行递归调用,而不管我们正在排序的部分是否已经按顺序排序(除非是基本情况)
  • 插入排序查找第一个不符合所需顺序的元素,并将其向左移动,直到其符合顺序为止。如果没有这样的索引,则不会发生移位,算法将完成,只执行
    O(N)
    比较
  • 然而,合并排序是相当固定的w.r.t.最佳运行时间!在进入递归之前,您可以检查手头的零件是否已经排序。这不会改变
    O(N logN)
    的最坏情况复杂度(但是,该常数将加倍),但会将最佳情况复杂度带到
    Omega(N)


    在数据按相反顺序排序的情况下,插入排序的最坏情况将显示出来,因为我们必须将每个元素(按迭代顺序)从其位置移动到第一个位置,进行
    N(N-1)/2
    交换,这属于
    O(N^2)
    。但是,由于其递归方法,合并排序仍然采用
    O(N logN)

    您所说的“(除非是基本情况)。”?大多数合并排序的库实现都是插入排序和合并排序的变体,通常是插入排序和合并排序的混合,例如,Wikipedia称之为@EmilB对于递归算法,基本情况是不递归,而是用不同的、通常是暴力或琐碎的方式解决问题。在合并排序的情况下,它可能是长度为0或1的子数组(因为它已经排序,您不必执行任何操作,只需返回即可)。您所说的“(除非是基本情况)。”?大多数合并排序的库实现都是插入排序和合并排序的变体,通常是插入排序和合并排序的混合,例如,Wikipedia称之为@EmilB对于递归算法,基本情况是不递归,而是用不同的、通常是暴力或琐碎的方式解决问题。在合并排序的情况下,它可能是长度为0或1的子数组(因为它已经排序,您不必做任何事情,只需返回)。