老师我不是很懂java的一些语法。。。开头的时候temp已经拷贝arr开辟了空间,为什么还要在每一次merge的函数中使用arraycopy呢?
来源:2-3 归并排序法的内存操作优化
慕前端9409642
2021-04-23 12:07:46
老师我不是很懂java的一些语法。。。开头的时候temp已经拷贝arr开辟了空间,为什么还要在每一次merge的函数中使用arraycopy呢?
1回答
liuyubobobo
2021-04-23
这不是一个语法问题,这是一个算法逻辑问题。
首先,在归并排序开始为 temp 拷贝 arr 的所有元素不是必须,只要把空间开出来就好,可以参考这里:https://class.imooc.com/course/qadetail/284347
但是,在每次 merge 的过程中,做 arraycopy 是必须。这是因为我们在 merge 的过程中,必须保证 temp 中的元素和相应区间里 arr 的元素一致。可是由于我们没有在每次 merge 完整理好 arr 后把 arr 的元素拷贝回 temp,这一点是无法保证的。
你可以尝试把 merge 中的 arraycopy 注释掉,看看程序是否正确?如果还想不明白,可以尝试使用一个小的测试用例,比如只有 8 个元素的数据,实际跟踪一下,看一下如果没有 arraycopy,为什么程序会出问题?
继续加油!:)
相似问题