06归并排序
基本思想:将整个数组看成n个长度为1的有序序列,两两归并且同时排序,最后合并成完整数组。
讲解:
//创建一个名为Merge_sort的驱动函数,传入待排序数组及其大小
public static void Merge_sort(int a[],int len){
//通过这个方法去调用Msort这个方法
Msort(a,0,len - 1);
}
//创建一个名为Msort的归并函数,传入待排序数组,起始位置start,结束位置end
public static void Msort(int a[],int start,int end){
//判断当前区间内的元素个数是否为1,
if(start >= end){
//是则直接退出。递归结束条件
return;
}
//mid记录当前区间的中间位置
int mid = (start + end) / 2;
//对左半区进行归并排序
Msort(a,start,mid);
//对右半区进行归并排序
Msort(a,mid + 1,end);
//调用Merge方法,合并两个子序列
Merge(a,start,mid + 1,end);
}
//创建一个名为Merge的方法,传入待排序数组、左边界、中间位置、右边界
public static void Merge(int a[],int start,int mid,int end){
//新建一个临时数组b,大小为:右边界 - 左边界 + 1
int[] b = new int[end - start + 1];
//定义变量cur为下标指针,初始为0,定义i为起始位置,j为结束位置
int cur = 0,i = start,j = mid;
//while循环条件:左边界i不超过mid 且 j不超过右边界
while(i < mid && j <= end){
//判断两个区间的元素大小
//若左边的元素小于或等于右边元素
if(a[i] <= a[j]){
//将左边元素a[i]元素加入到临时数组b,i和cur同时+1
b[cur++] = a[i++];
}else{
//否则将右边元素a[j]将入到临时数组b,j和cur同时+1
b[cur++] = a[j++];
}
}
//当while循环结束时,说明两个区间中有一个区间遍历到底了
//我们先判断是否为左半区间到底
while(i <mid){
//如果不是则将左半区所有元素依次加入到临时数组b
b[cur++] = a[i++];
}
//再判断是否为右半区到底
while(j <= end){
//如果不是则将右半区所有元素依次加入到临时数组b
b[cur++] = a[j++];
}
//重新赋值cur的值为0
cur = 0;
//定义index起始值为start,结束值为end,遍历该区间所有元素
for(int index = start;index <= end;index++){
//将b数组中所有元素依次加入到原数组a中
a[index] = b[cur++];
}
}