import java.util.Arrays;
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-l)/2;
//将原来的序列分为左右两个子序列arr[l,mid]和arr[mid+1,r],分别对两个子序列进行排序
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);
//i:arr[l,mid]的头指针 j:arr[mid+1,r]的头指针
int i = l,j = mid+1;
//每轮循环为arr[k]赋值
for(int k = l;k <= r;k++){
//当左子序列的所有元素有序的插入arr中后,将右子序列剩下的元素插入arr中
if(i > mid){
//emp[j-l] = arr[j]
arr[k] = temp[j - l];
j++;
}
//当右子序列的所有元素有序的插入arr中后,将左子序列剩下的元素插入arr中
else if(j > r){
//temp[i-l] = arr[i]
arr[k] = temp[i - l];
i++;
//当左子序列中的最小元素比右子序列中的最小元素小时,将左子序列的最小元素插入arr中
}else if(temp[i-l].compareTo(temp[j-l])<= 0){
arr[k] = temp[i-l];
i++;
//当右子序列中的最小元素比右子序列中的最小元素小时,将右子序列的最小元素插入arr中
}else{
arr[k] = temp[j-l];
j++;
}
}
}
归并排序-java实现
最新推荐文章于 2024-07-17 23:54:01 发布