原理:
归并的含义是将两个或两个以上的有序表合并成一个新的有序表。
第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.
第二, 治理: 对每个子序列分别调用devide函数, 进行递归操作,将两个子序列分为只有一个元素的子序列。
第三, 合并: 创建一个临时数组, 先比较两个子序列的第一个元素把小的元素放到数组中。然后索引增加继续向后比较,把小的放在临时数组中。在查看左右两个子序列是否有剩余元素,如果有剩余元素直接添加进临时数组。最后将临时数组的值覆盖之前的数组。即可完成排序。
原理图:
代码:
package test;
public class Test {
public static void sort(int[]a){
int l=0;
int r=a.length-1;
devide(a,l,r);
}
public static void devide(int []a,int left,int right){
int mid=(left+right)/2;
if(left<right){
devide(a,left,mid);
devide(a,mid+1,right);
merge(a,left,mid,mid+1,right);
}
}
private static void merge(int[] a, int left, int mid, int i, int right) {
int [] temp=new int[a.length];
int index=left;
int ls=left,le=mid;
int rs=i,re=right;
while (ls<=le && rs<=re) {
if (a[ls] < a[rs]) {
temp[index] = a[ls];
ls++;
} else {
temp[index] = a[rs];
rs++;
}
index++;
}
if(ls<=le){
for(int j=ls;j<=le;j++){
temp[index++]=a[j];
}
}
if(rs<=re){
for(int j=rs;j<=re;j++){
temp[index++]=a[j];
}
}
for(int j=left;j<=right;j++){
a[j]=temp[j];
}
}
public static void main(String[] args) {
int[]a={20,69,58,45,36,75};
sort(a);
for(int i=0;i<a.length;i++) {
System.out.println(a[i]);
}
}
}
运行结果:
原理图来源:https://blog.youkuaiyun.com/qq_36442947/article/details/81612870