归并排序和快速排序都是基于分而治之的算法思想。
归并排序先将待排序的数组不断拆分,直到拆分到区间里只剩下一个元素的时候。不能再拆分的时候。这个时候我们再想办法合并两个有序的数组,得到长度更长的有序数组。当前合并好的有序数组为下一轮得到更长的有序数组做好了准备。一层一层的合并回去,直到整个数组有序。
import java.util.Arrays;
public class Main{
private static int[] assist ;
public static void main(String[] args) {
int[] a = {32,54,65,67,86,76,64,34};
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] a){
//初始化数组assist
assist = new int[a.length];
//定义变量lo,hi,分别记录数组中的最大索引和最小索引
int lo = 0;
int hi = a.length-1;
//调用sort重载方法完成数组a中,从索引lo到索引hi的元素排序
sort(a,lo,hi);
}
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);
//把两个数组中的元素进行归并
merge(a,lo,mid,hi);
}
/*
对数组中,从lo到mid为一组,从mid+1到hi为一组,对这两组数据进行归并
*/
private static void merge(int[] a,int lo,int mid,int hi){
//定义三个指针
int i=lo;
int p1=lo;
int p2=mid+1;
//遍历,移动指针p1,p2比较索引处的值,找出更小的那个放到辅助数组中
while (p1<=mid && p2<=hi){
if (a[p1]<a[p2]){
assist[i++]=a[p1++];
}else {
assist[i++]=a[p2++];
}
}
//把剩余的没移动的数组,顺序移动到辅助数组中去
while (p1<=mid){//lo->mid
assist[i++]=a[p1++];
}
while (p2<=hi){//mid+1->hi
assist[i++]=a[p2++];
}
//把辅助数组中的数拷贝到原数组中
for (int index = lo; index <=hi ; index++) {
a[index] = assist[index];
}
}
}