老师我不是很懂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,为什么程序会出问题?


继续加油!:)


0

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2610 学习 · 1087 问题

查看课程