数据结构与算法实战(五)归并排序法
一、原理
MergeSort(arr, l, r){
if(l >= r) return; //求解最基本问题
int mid = (l + r) / 2;
//将原问题转化为更小的问题
//对arr[l , mid]进行排序
MergeSort(arr , l, mid);
//对arr[mid + 1 , r]进行排序
MergeSort(arr , mid + 1, r);
//将arr[l , mid]和arr[mid + 1 , r]合并
merge(arr, l, mid, r);
}
二、归并的过程
归并的过程无法原地完成,需要借助一个临时数组暂存原数组的元素
//将两个有序区间arr[l , mid]和arr[mid + 1 , r]合并
private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r){
E[] temp = Arrays.copyOfRange(arr,l,r+1);//将arr[l , r+1) 复制到tem中
int i = l ,j = mid + 1;
//每轮循环为arr[k] 赋值
for (int k = l; k <= r; k++) {
//判断i 是否越界
if(i > mid){
arr[k] = temp[j - l]; j++;
}
//判断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++;
}
}
}
三、实现归并排序算法
public class MergeSort {
private MergeSort(){
};
public static <E extends Comparable<E>> void sort(E[] arr){
sort(arr,0,arr.length - 1);
}
private static <E extends Comparable<E>> void sort(E[] arr, int l, int r){
if(l >= r) return;
int mid = (l + r) / 2;
sort(arr,l,mid);
sort(arr,mid + 1, r);
merge(arr,l,mid,r);
}
//将两个有序区间arr[l , mid]和arr[mid + 1 , r]合并
private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r){
E[] temp = Arrays.copyOfRange(arr,l,r+1);//将arr[l , r+1) 复制到tem中
int i = l ,j = mid + 1;
//每轮循环为arr[k] 赋值
for (int k = l; k <= r; k++)