📜  通过结合插入排序和合并排序算法进行排序

📅  最后修改于: 2022-05-13 01:56:05.172000             🧑  作者: Mango

通过结合插入排序和合并排序算法进行排序

插入排序:数组实际上分为已排序和未排序的部分。未排序部分的值被拾取并放置在已排序部分的正确位置。
优点:以下是插入排序的优点:

  • 如果要排序的列表的大小很小,则插入排序运行得更快
  • 当元素已经排序时,插入排序需要 O(N) 时间
  • 它是一个就地算法 O(1),不需要辅助空间

合并排序:合并排序是一种分治算法。它将输入数组分成两半,为这两半调用自身,然后合并两半排序。

优点:以下是归并排序的优点:

  • 将主问题划分为子问题没有大的成本

从以上两个比较可以看出,两种排序算法的优点可以结合起来,得到的算法会有时间复杂度O(N[K+log(N/K)])。下面是这个组合算法的时间复杂度推导:
让,不。列表中的元素数 = N
划分

  • 我们首先将这 N 个元素分成 (N/K) 个大小为 K 的组

排序

  • 对大小为 K 的子数组的每一个划分,执行插入排序操作对这个子数组进行排序
  • 单个 K 元素块的插入排序的总成本:
    • 最佳情况:O(K)
    • 最坏情况:O( K^{2})
  • 由于每个大小为 K 的块有 (N/K) 个,我们得到应用插入排序的总成本为:
    • 对于最佳情况: (N/K) * K = O(N) <– (1)
    • 对于最坏的情况: (N/K) * K^{2} = O(NK) <– (2)

合并

  • 在对 (N/K) 个组应用插入排序后,每个 K 个已排序元素
  • 合并这些 (N/K) 组:

  • 假设我们采用合并排序的 i 次迭代。因此,要停止循环,我们需要等同于:
  • (2^i) * K = N
  • (2^i) = N/K
  • i*log(2) = log(N/K) 两边取log
  • i = log(N/K)
  • 合并成本 = O(N)
  • 合并总成本=迭代次数*迭代成本
    • = log(N/K)*N
    • = N*log(N/K)
    • = O(N*Log(N/K)) <– (3)

算法的总成本(插入+合并)为:

  • 最佳情况:N+Nlog(N/K) <– 来自 (1) 和 (3)
  • 最坏情况:NK + Nlog(N/K) <– 来自 (2) 和 (3)

如果K = 1,那么它是完全归并排序,在时间复杂度方面更好
如果K = N,那么它是完全插入排序,在空间复杂度方面更好