所有的介绍也都在代码里
希望帮助到大家
import java.util.Arrays;
//采用递归来实现归并排序
public class mesort {
public static void main(String[] args) {
int [] m={1,34,5,2,55,66};
mesort.sort2(m);
for (int value : m) {
System.out.println(value);
}
}
private mesort(){}
public static void sort(int []arr){
sort(arr,0,arr.length-1);
}
public static void sort(int[]arr,int l,int r){
//此方法实现的是把数组的从l到r的排序
if(l>=r)
return;
int mid=(l+r)/2;
sort(arr,l,mid);
sort(arr,mid+1,r);
merge(arr,l,mid,r);
}
public static void merge(int []arr,int l,int mid,int r ) {
//合并两个数组的方法
int[] team = Arrays.copyOfRange(arr, l, r + 1);
//先将一个本数组进行拷贝 为什么是r+1呢 因为这个方法右边是不包括的,所以要加1
//在拷贝的数组中进行操作 把操作后得到的值给原数组
int i = l;
int j = mid + 1;
//下面就是比较了 用前半个数组来和后半个数组进行比较 前面从i开始 后面从j开始
//只要i到了中间以后 j到了r以后 直接就结束了 将比较后的值来传给原来的数组
for (int k = l; k <=r; k++) {
if (i > mid) {
arr[k] = team[j - l];
j++;
}
else if (j > r) {
arr[k] = team[i - l];
i++;
}
else if (team[i-l] > team[j-l]) {
arr[k] = team[j - l];
j++;
} else if(team[i-l] <team[j-l]){
arr[k] = team[i - l];
i++;
}
}
}
//这个方法是采用非递归的方式来实现归并排序的
//基本就是采用自底向上的方式来实现,先把数组两两配对,实现排序 然后慢慢扩大数组的排序组数
//2个配对 4个 8个 直到排序完成
public static void sort2(int[]arr){
int n= arr.length;
for(int size=1;size<n;size+=size){
for(int i=0;i+size<n;i+=size+size){
//合并i i+size-1和i+size i+size+size-1
//前面这句话据说i到i+size但是不包括i+size这个值
merge(arr,i,i+size-1,Math.min(i+size+size-1,n-1));
//为什么要用math这个方法呢 因为 可能i+size+size-1这个值已经出界了
// 但是n-1是一定没有出界的
}
}
}
}