声明:本文可能存在不足,如有错误,敬请指正,礼貌交流,感激不尽。
约定:log2 n代表以2为底,n的对数
1,为什么需要进行log2 n趟?
可以这样理解:二路归并就是把两路数据合二为一,逆过来看就是将n个数据不断除以2取整,直到n变为1,所以需要log2 n趟。
如果从归并树的角度来理解的话会麻烦一点。(仔细看上面的归并树,需要进行的趟数(层数-1)就是归并树的高度减一,注意要减一才符合接下来的逻辑。假设记录共有n个,共k层,那么2^(k-1) >= n。所以k-1>=log2 n,粗略估计就是log2 n。)
2,为什么需要移动nlog2n次记录?
仔细看以上的图,归并排序一趟就是比较i和j所指元素的大小,选择较小者存入k所指位置。每往k中存入一个数据,我们就称发生了一次记录移动。所以每一趟都会发生n次记录的移动。总共log2 n趟,所以总共会发生n*log2 n次记录的移动。