通过结合插入排序和合并排序算法进行排序
插入排序:数组实际上分为已排序和未排序的部分。未排序部分的值被拾取并放置在已排序部分的正确位置。
优点:以下是插入排序的优点:
- 如果要排序的列表的大小很小,则插入排序运行得更快
- 当元素已经排序时,插入排序需要 O(N) 时间
- 它是一个就地算法 O(1),不需要辅助空间
合并排序:合并排序是一种分治算法。它将输入数组分成两半,为这两半调用自身,然后合并两半排序。
优点:以下是归并排序的优点:
- 将主问题划分为子问题没有大的成本
从以上两个比较可以看出,两种排序算法的优点可以结合起来,得到的算法会有时间复杂度O(N[K+log(N/K)])。下面是这个组合算法的时间复杂度推导:
让,不。列表中的元素数 = N
划分:
- 我们首先将这 N 个元素分成 (N/K) 个大小为 K 的组
排序:
- 对大小为 K 的子数组的每一个划分,执行插入排序操作对这个子数组进行排序
- 单个 K 元素块的插入排序的总成本:
- 最佳情况:O(K)
- 最坏情况:O(
- 由于每个大小为 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,那么它是完全插入排序,在空间复杂度方面更好