对内存操作优化后, 速度更慢
public static <E extends Comparable<E>> void sort4(E[] arr) { E[] temp = Arrays.copyOf(arr, arr.length); sort4(arr, 0, arr.length - 1, temp); } private static <E extends Comparable<E>> void sort4(E[] arr, int l, int r, E[] temp) { if (l >= r) return; int mid = l + (r - l) / 2; sort4(arr, l, mid, temp); sort4(arr, mid + 1, r, temp); if (arr[mid].compareTo(arr[mid + 1]) > 0) merge2(arr, l, mid, r, temp); } // 合并两个有序区间arr[l..mid]和arr[mid+1...r] private static <E extends Comparable<E>> void merge2(E[] arr, int l, int mid, int r, E[] temp) { System.arraycopy(arr, l, temp, l, r - l + 1); int i = l, j = mid + 1; // 每轮循环为arr[k]赋值 for (int k = l; k <= r; k ++) { if (i > mid) { break; // 或者直接break,因为右侧的数组本身就是有序的 } else if (j > r) { arr[k] = temp[i]; i ++; } else if (temp[i].compareTo(temp[j]) <= 0) { arr[k] = temp[i]; i ++; } else { arr[k] = temp[j]; j ++; } } }
MergeSort2, n = 5000000: 1.529831 s
MergeSort4, n = 5000000: 1.555577 s
MergeSort2是判断是否需要merge的优化, MergeSort4不仅判断是否需要进行merge操作, 还对内存操作进行了优化, 为什么时间更长呢?
19
收起
正在回答
1回答
如果我没有理解错的话,你的意思是在你的环境下,课程的这个代码离得 MergeSort 和 MergeSort2 没有性能优化的效果。(MergeSort2 经过了内存优化;MergeSort 没有。)
虽然这种“常数级”的性能优化会受机器的硬件配置,操作系统,你所使用的编译器版本等等因素的影响,但整体这个在大数据量下没有效果是不应该的。
请尝试在你的环境下运行上面的课程代码,看是否同样如此?如果不是的话,请检查你的代码哪里有问题。(你现在给我的代码只有 sort4 的代码,没有 sort2 的代码。但 sort4 的代码在调用 merge2?道理上是否做这步内存优化,调用的 merge 的逻辑是有不同的,请检查是否有类似的调用错误。)
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星