根据归并算法的实现原理我们得知:每次分组时组内元素个数上限都是2的幂次方
我们可以令步长step的初值为2,然后将数组中每step个元素作为一组,将其内部进行排序,(将左step/2个元素和右step/2个元素合并),
再令step/2 乘以 2,执行同样的操作
如果step/2大于数组长度,那么算法终止
3 1 2 8 7 5 9 4 0 6
分组
3 1 | 2 8 | 7 5 | 9 4 | 0 6
排序
1 3 | 2 8 | 5 7 | 4 9 | 0 6
合并
1 3 2 8 | 5 7 4 9 | 0 6
排序
1 2 3 8 | 4 5 7 9 | 0 6
合并排序
0 1 2 3 4 5 6 7 8 9
void nMergeSortPlus(int nums[], int n) {
for (int step = 2; step / 2 <= n; step *= 2) {
for (int i = 0; i < n; i += step) {
sort(nums + i, nums + min(i + step, n));
}
//可以在这里选择输出
}
}
相关习题: PAT1089