【实现】
public class MergeSort<E>{
private MergeSort(){}
public static <E extends Comparable<E>>void sort(E[] arr){
sort(arr,0, arr.length-1,0);
}
public static <E extends Comparable<E>>void sort(E[] arr,int l,int r,int depth){
String depthString = generateDepthString(depth);
System.out.print(depthString);
System.out.println(String.format("mergesort arr[%d,%d]",l,r));
if(l >= r){
return;
}
int mid = l + (r - l) / 2;
sort(arr,l,mid,depth + 1);
sort(arr,mid+1,r,depth + 1);
System.out.print(depthString);
System.out.println(String.format("merge arr[%d,%d] and arr[%d,%d]",l,mid,mid+1,r));
merge(arr,l,mid,r);
System.out.print(depthString);
System.out.print(String.format("after arr[%d,%d]",l,r));
for(E e:arr){
System.out.print(e + " ");
}
System.out.println();
}
public static <E extends Comparable<E>>void merge(E[] arr,int l,int mid,int r){
E[] temp = Arrays.copyOfRange(arr,l,r + 1);
int i = l,j = mid + 1;
for (int k = l; k <= r;k++) {
if(i > mid){
arr[k] = temp[j-l];
j++;
}else if(j > r){
arr[k] = temp[i-l];
i++;
}else if(temp[i-l].compareTo(temp[j-l]) <= 0){
arr[k] = temp[i-l];
i++;
}else{
arr[k] = temp[j-l];
j++;
}
}
}
private static String generateDepthString(int depth){
StringBuilder res = new StringBuilder();
for (int i = 0; i < depth; i++) {
res.append("---");
}
return res.toString();
}
public static void main(String[] args) {
Integer[] arr = {7, 1, 4, 2, 8, 3, 6, 5};
sort(arr);
}
}
【结果】
mergesort arr[0,7]
---mergesort arr[0,3]
------mergesort arr[0,1]
---------mergesort arr[0,0]
---------mergesort arr[1,1]
------merge arr[0,0] and arr[1,1]
------after arr[0,1]1 7 4 2 8 3 6 5
------mergesort arr[2,3]
---------mergesort arr[2,2]
---------mergesort arr[3,3]
------merge arr[2,2] and arr[3,3]
------after arr[2,3]1 7 2 4 8 3 6 5
---merge arr[0,1] and arr[2,3]
---after arr[0,3]1 2 4 7 8 3 6 5
---mergesort arr[4,7]
------mergesort arr[4,5]
---------mergesort arr[4,4]
---------mergesort arr[5,5]
------merge arr[4,4] and arr[5,5]
------after arr[4,5]1 2 4 7 3 8 6 5
------mergesort arr[6,7]
---------mergesort arr[6,6]
---------mergesort arr[7,7]
------merge arr[6,6] and arr[7,7]
------after arr[6,7]1 2 4 7 3 8 5 6
---merge arr[4,5] and arr[6,7]
---after arr[4,7]1 2 4 7 3 5 6 8
merge arr[0,3] and arr[4,7]
after arr[0,7]1 2 3 4 5 6 7 8