归并的思想:归并排序也是基于分治法的。归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。合并两个子序列的过程也就是两路归并。
复杂度:归并排序最好、最差和平均时间复杂度都是nlog2n。
归并排序是稳定的排序算法
归并排序实现代码
public class Merger {
//拆分数组
public static void mergeSortIntern(int[] array,int l,int r) {
if (l >= r)
return;
int mid = (l + r) / 2;
mergeSortIntern(array, l, mid);
mergeSortIntern(array, mid + 1, r);
merge(array, l, mid, r);
}
//合并数组
private static void merge(int[] array,int l,int mid,int r) {
int i = l;
int j = mid+1;
int k = 0;
//创建一个临时数组用来存放排序后的数组
int[] temp = new int[r-l+1];
//将两个数组合并为一个数组
while (i <= mid && j <= r) {
if (array[i] <= array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
//判断一下两个数组是否有剩余的元素
int start = i;
int end = mid;
if(j <= r){
start = j;
end = r;
}
//将剩余元素添加到临时数组中
while (start <= end){
temp[k++] = array[start++];
}
//将临时数组的内容拷贝到原数组
for( i = 0;i <= r-l;i++ ){
array[l+i] = temp[i];
}
}