1.动态图示例
2.Java 代码
思路:自顶向下均分数组,自底向上合并分支
public void mergeSort(int[] A){
if( A==null || A.length == 1 ) return;
int[] B=new int[A.length];
int n=A.length;
mergeSort(A,0,n-1,B);
}
public void mergeSort(int[] A,int start,int end,int[] B){
if (start >= end)
return;
int middle=(start+end)/2;
mergeSort(A,start,middle,B);
mergeSort(A,middle+1,end,B);
merge(A, start, middle, end, B);
copy(B,start,end,A);
}
public void merge(int[] A,int start,int middle,int end,int[] B){
int swapi = 0;
int i0 = start;
int i1 = middle + 1;
for (int i = start; i <= end; i++) {
if (i0 <= middle && (i1 > end || A[i0] < A[i1])) {
swapi = i0;
i0++;
} else {
swapi = i1;
i1++;
}
B[i] = A[swapi];
}
}
public void copy(int[] A,int start,int end,int[] B){
for(int i=start;i<=end;i++){
B[i]=A[i];
}
}
3.测试代码
MergeSort mergeSort=new MergeSort();
int[] a = new int[10000000];
Random random = new Random();
for (int i = 0; i < a.length; i++) {
a[i] = random.nextInt(Integer.MAX_VALUE);
}
long startTime = System.currentTimeMillis();
mergeSort.mergeSort(a);
long endTime = System.currentTimeMillis();
System.out.println(a.length + " 数据,归并排序用时:" + (endTime - startTime) + " ms");