对内存操作优化后, 速度更慢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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积分~
来为老师/同学的回答评分吧