程序
public class MergeSort{
public static void main(String[] args){
int[] arr = {1,3,5,3,0,8,6,9,2,7,8};
mergeSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr){
sort(arr,0,arr.length-1);
}
/**
* 递归二分
* @param arr
* @param L
* @param R
*/
public static void sort(int[] arr,int L,int R){
if(R==L){
return;
}
int mid = L+((R-L)>>1);
sort(arr,L,mid);
sort(arr,mid+1,R);
merge(arr,L,mid,R);
}
/**
* 排序合并
* @param arr
* @param L
* @param mid
* @param R
*/
public static void merge(int[],int L,int mid,int R){
//归并就是有序序列的拼接
int[] temp = new int[R-L+1];
int i =0;
int p1=L;
int p2=mid+1;
//将左右序列有序合并
while(p1<=mid&&p2<=R){
temp[i++]=arr[p1]>arr[p2]?arr[p2++]:arr[p1++];
}
//当有一侧序列完成合并,剩余的继续合并
while(p1<=mid){
temp[i++]=arr[p1++];
}
while(p2<=R){
temp[i++]=arr[p2++];
}
//将局部有序列复制给原数组
for(i=0;i<temp.length;i++){
arr[L+i]=temp[i];
}
}
}
测试结果
[0, 1, 2, 3, 3, 5, 6, 7, 8, 8, 9]
tips:这是一种经典的分治。利用递归,二分整个序列,(进行比较的同时归并)局部有序从两个增加到全部
声明
非本人的程序,参考他人程序实现,加上自己的注解。
参考:归并排序Java实现原版
更详细内容,看这个大哥的,有动图演示 数据结构十大经典算法
本文介绍了一种经典的分治排序算法——归并排序的Java实现。通过递归二分整个序列,局部有序从两个增加到全部,最终实现数组的完全排序。测试结果展示了排序后的数组为[0,1,2,3,3,5,6,7,8,8,9]。
—— 归并排序(知识的搬运工)&spm=1001.2101.3001.5002&articleId=104119206&d=1&t=3&u=569d6763d6f34eedad67bda001ff89ce)

被折叠的 条评论
为什么被折叠?



