步骤
- 分解数组
- 递归求解
- 合并排序
时间复杂度
用递归树法分析复杂度
代码
package LinearList;
/**
* 归并排序
* @author Cuminer
* 2020-11-30
*/
public class MergeSort {
public static final int ARR_LEN = 20;
/**
* 二叉树递归遍历,自顶向下拆分,自底向上合并
* @param A
* @param left
* @param right
*/
void mergeSort(int[] A,int left,int right) {
if(left<right) {
int mid = (left+right)/2;
mergeSort(A,left,mid);
mergeSort(A,mid+1,right);
merge(A,left,mid,right);
}
}
void merge(int[] A,int left,int mid,int right) {
/*
* 左序列的head_index
*/
int l = left;
/*
* 右序列的head_index
*/
int r = mid+1;
/*
* B[]移动的指针
*/
int k = 0;
/*
* B[]是缓存数组,存入比较后的值,最后复制给A[]
*/
int[] B = new int[ARR_LEN];
while(l<=mid && r<=right) {
if(A[l]<A[r]) {
B[k++] = A[l++];
} else {
B[k++] = A[r++];
}
}
/*
* 如果左序列比较完,就把右边的剩余队列直接按顺序填上
*/
if(l==mid+1) {
while(r<=right) {
B[k++] = A[r++];
}
}
/*
* 如果右序列比较完,就把左边的剩余队列直接按顺序填上
*/
if(r==right+1) {
while(l<=mid) {
B[k++] = A[l++];
}
}
/*
* 把B[0,k]复制到A[left,left+k],这里没定义新变量,直接用了l和r
*/
for(r = 0,l = left;r<k;l++,r++) {
A[l] = B[r];
}
}
public static void main(String[] args) {
MergeSort ms = new MergeSort();
int[] a={9,8,7,6,5,4,3,2,1};
ms.mergeSort(a,0,8);
for(int i : a) {
System.out.println(i);
}
}
}