class Merge
{
/*
归并排序法原理:
合并,排序两部分
1、递归分解数组
比如数组 1,8,3,2,6,7
折半分解
1,8,3 2,6,7
两部分进一部分解
1,8 3 同样
继续分解
1、8、3
合并排序
1,3,8 2,6,7
合并排序
1,2,3,6,7 8
当分解此时,调用m函数合并
aux[] 临时存储原先数组
aux = 1,8,3,2,6,7
下面才是排序的关键
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
if (i > mid ) a[k] = aux[j++]; // 最左边
else if (j > hi) a[k] = aux[i++]; // 最右边
else if (aux[j] > aux[i]) a[k] = aux[j++]; // 判断 比如 3 < 1 交换
else a[k] = aux[i++]; // 中单部分 赋值 i自增
}
lo 其实就是frist
hi 就是 last
*/
private static int [] aux;
public static void sort(int[] a) {
// 声名一个临时数组
aux = new int[a.length];
// 调用递归
sort(a,0,a.length -1);
}
public static void main(String[] args) {
int[] a = {1,8,3,2,6,7,20,100,23,52,67};
// 调用递归
sort(a);
Print(a);
}
public static void Print(int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
System.out.print(",");
}
System.out.println(".....");
}
public static void Print(int a) {
System.out.println(a);
}
// 合并函数
public static void m(int[] a, int lo, int mid, int hi) {
int i = lo, j = mid + 1;
// 先把a[]的值转移到aux
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
// j 是右边 i 是左边
for (int k = lo; k <= hi; k++) {
if (i > mid ) a[k] = aux[j++]; // 最左边
if (j > hi) a[k] = aux[i++]; // 最右边
else if (aux[j] > aux[i]) a[k] = aux[j++]; // 判断
else a[k] = aux[i++]; // 中单部分
}
}
// 分解函数 lo = frist hi = last
private static void sort(int[] a, int lo, int hi) {
if (hi <= lo) return ;
// 折半
int mid = lo + (hi - lo) /2;
// 左边
sort(a, lo, mid);
// 右边
sort(a, mid + 1,hi);
m(a, lo, mid, hi);
}
}