思路
- 分治法,先分(每次通过merge的递归,均分成两份),再治(在递归的过程中调用mergeTwoArray来归并)
- 在归并的过程中完成排序
细节
- mergeTwoArray函数的while判断条件注意mid和end的值,我写的是将实参为mid+1;end+1这样直接将cur1!=mid作为条件就可,这地方晕了好久
- 看别人的代码,在mergeTwoArray中,只剩一个部分还未遍历的情况下,可以直接用while的条件来判断哪个还未遍历完,不用特意的再写if语句
代码
static int[] merge(int[] ar,int start,int end) {
if(start>=end)
return ar;
int mid = (start + end )/ 2;
merge(ar, start, mid);
merge(ar, mid + 1, end);
mergeTwoArrays(ar,start,end+1,mid+1);
return ar;
}
static void mergeTwoArrays(int[] ar,int start,int end,int mid){
int[] tmpArray = new int[end-start+1];
int cur1 = start;
int cur2 = mid;
int cur3 = 0;
while(cur1!=mid&&cur2!=end){
if( ar[cur1]<ar[cur2]){
tmpArray[cur3++] = ar[cur1++];
}else{
tmpArray[cur3++] = ar[cur2++];
}
}
while (cur2!=end) {
tmpArray[cur3++] = ar[cur2++];
}
while (cur1!=mid){
tmpArray[cur3++] = ar[cur1++];
}
int cur4 = start;
int cur5 = 0;
while (cur4!=end){
ar[cur4++] = tmpArray[cur5++];
}
}