归并排序是用二分法实现的一种快速算法时间复杂度为nlogn 效率上大于n²级别算法,对排序队列进行等分递归等分的数组进行复制操作进行比较达到用空间换时间的目的。思路表现对当前数组进行递归等分知道等分队列为1为止,在等分递归中在对当前数组等分下的两个数据进行依次对标比较。
比如数组[4,6,11,14,18,2,1,9,10,64]等分为[4,6,11,14,18] [2,1,9,10,64] ,记第一个数组下标为i,第二个数组下标为j。对大数组进行循环,从第一个位置开始比较两个数组,比如第一个位置i的下标为0数值为4 第二个位置j的下标为0数值为2,则在大数组第一个位置中填入2对j的下标进行+1操作,以此类推。当i的下标大于数组中间值的时候,第一个数组排序完毕,则对j的数组进行+1操作。当j的下标大于数组右侧边界的时候,第二个数组排序完毕,则对i的数组进行+1操作。
private static void merge(Comparable[] arry, int l, int r,int mid) {
Comparable[] copyArry = Arrays.copyOfRange(arry, l, r+1);
int i = l, j = mid+1;
for (int z = l; z <= r; z++) {
if (i > mid) {
arry[z] = copyArry[j-l];
j++;
}else if (j > r) {
arry[z] = copyArry[i-l];
i++;
}else if (copyArry[i-l].compareTo(copyArry[j-l]) < 0) {
arry[z] = copyArry[i-l];
i++;
}else if (copyArry[j-l].compareTo(copyArry[i-l]) < 0) {
arry[z] = copyArry[j-l];
j++;
}
}
}
public static void sort(Comparable[] arry, int l, int r) {
if( l >= r )
return;
int mid = (l+r) / 2;
sort(arry, l, mid);
sort(arry, mid + 1, r);
merge(arry, l, r,mid);
}