是否有(混合)自下而上合并排序的实现,其中合并数组大小不等于 2 的幂?
Is there an implementation of (hybrid) bottom-up merge sort where merged array size is not equal to power of 2?
"pure"自下而上归并排序只能合并两个已排序的数组,唯一"surely"已排序的数组的大小为1。这就是算法创建大小为的已排序数组的原因2,4,8...
但是由于可以通过简单的(渐近较慢的)算法更有效地对小数组进行排序,因此经常使用混合实现。我的问题是:是否存在 "simple array's" 大小不是 2 的幂的实现?例如,10?地点和原因?
通常,混合自下而上合并排序/插入排序会选择 16 到 128 个元素之间的组大小,以便合并排序执行偶数次遍历,以便数据最终回到原始数组中(因为这些合并排序通常会在每次合并过程中更改原始数组和工作数组之间的合并方向)。对于插入排序,2 的幂没有什么特别之处,因此可以使用任何合理大小的插入排序组。
我没有研究过选择 "ideal" 组大小的算法。粗略的方法是确定 "pure" 合并排序的遍数为 ceil(log2(n)),如果遍数为奇数,则使用 32 或 128 作为组大小,如果为偶数,使用 64 作为组大小。考虑 n = 8000000 的情况。纯合并排序的遍数为 23,因此组大小选择 32 或 128,将遍数减少到 18。对于尝试在改进的选择中(事实证明这不是改进),如果遍数是奇数,则使用 17 到 32 或 65 到 128 的组计数,如果遍数是偶数,则使用 33 的组计数64. 考虑 n = 1 + 2 的某个幂的情况。对于 n = 1+2^22 = 4194305,遍数为23,并且使用 32 的组大小将其减少到 18 次传球,而 128 将其减少到 16 次传球。然后计算 ceil(n/(2^18)) = 17 或 ceil(n/(2^16)) = 65.
我已经使用 C++ 代码(Visual Studio 2015,Win 7 Pro 64 位),它几乎没有什么区别,变化在我用相同代码重复运行得到的变化范围内(变化小于 1.5%)。
"pure"自下而上归并排序只能合并两个已排序的数组,唯一"surely"已排序的数组的大小为1。这就是算法创建大小为的已排序数组的原因2,4,8...
但是由于可以通过简单的(渐近较慢的)算法更有效地对小数组进行排序,因此经常使用混合实现。我的问题是:是否存在 "simple array's" 大小不是 2 的幂的实现?例如,10?地点和原因?
通常,混合自下而上合并排序/插入排序会选择 16 到 128 个元素之间的组大小,以便合并排序执行偶数次遍历,以便数据最终回到原始数组中(因为这些合并排序通常会在每次合并过程中更改原始数组和工作数组之间的合并方向)。对于插入排序,2 的幂没有什么特别之处,因此可以使用任何合理大小的插入排序组。
我没有研究过选择 "ideal" 组大小的算法。粗略的方法是确定 "pure" 合并排序的遍数为 ceil(log2(n)),如果遍数为奇数,则使用 32 或 128 作为组大小,如果为偶数,使用 64 作为组大小。考虑 n = 8000000 的情况。纯合并排序的遍数为 23,因此组大小选择 32 或 128,将遍数减少到 18。对于尝试在改进的选择中(事实证明这不是改进),如果遍数是奇数,则使用 17 到 32 或 65 到 128 的组计数,如果遍数是偶数,则使用 33 的组计数64. 考虑 n = 1 + 2 的某个幂的情况。对于 n = 1+2^22 = 4194305,遍数为23,并且使用 32 的组大小将其减少到 18 次传球,而 128 将其减少到 16 次传球。然后计算 ceil(n/(2^18)) = 17 或 ceil(n/(2^16)) = 65.
我已经使用 C++ 代码(Visual Studio 2015,Win 7 Pro 64 位),它几乎没有什么区别,变化在我用相同代码重复运行得到的变化范围内(变化小于 1.5%)。