06归并排序

83 阅读2分钟

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++];
    }
}