递归思想啊,将问题分而治之,解决最小的问题并迭代就ok了
private static void sort(Comparable[] arr, int l, int r) {
if (l >= r)
return;
int mid = l + (r - l) / 2;
sort(arr, l, mid);
sort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
如代码所示,每次传进私有函数sort(对应老师的__mergesort函数)的是一个片段arr[l...r],这是显而易见的。
当我将arr,0,n-1传进来时,代表我要排序的整个算法进来了,注意mid=l+(r-l)/2是我改进了一下防止mid溢出的;
这里的sort递归分别把整个数组的前半部分和后半部分再次sort,再各自分为一半。你要问的是那我们如何排序的,考虑当我们的函数进行到最后阶段,及base case l >= r之前,也就是r - l = 1的情况,即当我的数组片段长度为1时,仅有一个元素,不需要sort了,这里的merge就派上用场了,将我的元素合并起来,而且都是排序好的元素。
这里sort(arr,0,n-1) -> 下一层sort -> ... -> sort(); merge,你看,进入第一次sort后会无限的进入sort,直到满足base case l >=r,这就是堆栈了!弹出的时候会满足最后进去的式子,也就是最底层的merge后依次弹出,这时我们的数据自然也就排序好了!
如果看懂了。。请采纳