归并排序-JAVA代码 附注释

归并思想

先拆分后合并 也就是分治;
拆分合并思想具体讲解可以参考以下链接:
b站链接:

点这里:b站归并思想具体讲解

看代码

代码中的例子参考上图和下图

public class MergeSort {
    //一、拆分部分
    public static void split(int[] arr,int left,int right,int[] temp){
        //递归拆分
        if (left<right){
            int mid=(left+right)/2;
            //左递归分解
            split(arr, left, mid, temp);
            //右递归分解
            split(arr, mid+1, right, temp);
            //合并
            merge(arr,left,right,mid,temp); //这么理解就像递归就是重复干一件事 你调用执行就可
            //上面 先左递归合并 再右递归合并
        }
    }
    //二、合并部分
    /**
     * @param arr   要进行排序的初始数组
     * @param left  左序列数组的初始索引
     * @param right 右序列数组的初始索引
     * @param mid   左序列和右序列的交接地方 中间索引
     */
    public static void merge(int[] arr, int left, int right, int mid, int[] temp) {
        int i = left;//初始化i,作为左序列的初始索引
        int j = mid + 1;//初始化j,作为右序列的初始索引 mid是向下取整得来的
        int index = 0;//temp数组的当前索引
        //1.左右两边序列按照规则填充到temp数组 直到有一边处理完毕
        //循环条件 两边的数据均为处理完
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) { //左元素<=右 就把左里面的首位填充到temp
                temp[index] = arr[i];
                i++;//i后移
                index++;//index后移
            } else {//反之就填充右里面的首位
                temp[index] = arr[j];
                j++;
                index++;
            }
        }
        //当while循环结束 就有其中一边先处理完毕
        //2.把另一边中剩下的的数据直接依次填充到temp数组
            //满足哪个就去哪个循环进行填充
        while (j <= right) {
            temp[index] = arr[j];
            index++;
            j++;
        }
        while ((i <= mid)) {
            temp[index] = arr[i];
            index++;
            i++;
        }
        //3.temp数组拷贝到arr中
        //只有最后一次拷贝是把整个temp拷贝到arr数组中 前几次都是拷贝temp中的一部分
        //因为前几次的合并没有占满temp数组
        index=0;//temp索引归0;
        int tempLeft=left;
        //System.out.println("tempLeft="+tempLeft+" "+"right="+right);
            //第1次合并 tempLeft=0,right=1;
            //第2次合并 tempLeft=2,right=3;
            //第3次合并 tempLeft=0,right=3;
            //第4次合并 tempLeft=4,right=5;
            //第5次合并 tempLeft=6,right=7;
            //第6次合并 tempLeft=4,right=7;
            //第7次合并 tempLeft=0,right=7;//最后一次合并
        while (tempLeft<=right){
            arr[tempLeft]=temp[index];
            tempLeft++;
            index++;
        }
    }
    //主方法
    public static void main(String[] args) {
        int[] arr = new int[]{8, 4, 5, 7, 6, 2, 3, 9};
        int[] temp=new int[arr.length];
        split(arr,0, arr.length-1,temp);
        System.out.println(Arrays.toString(arr));

    }
}

在这里插入图片描述

归并排序是一种基于分治思想的排序算法,它的基本思路是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将有序的子序列合并成一个有序的序列。下面是归并排序Java代码实现: ``` public class MergeSort { public static void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } } public static void merge(int[] arr, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int p = 0; p < temp.length; p++) { arr[left + p] = temp[p]; } } } ``` 在这段代码中,mergeSort方法是归并排序的主方法,它接收一个待排序的数组arr和数组的左右边界leftright。在方法中,首先判断left是否小于right,如果是,则计算出数组的中间位置mid,然后递归调用mergeSort方法对左右两个子序列进行排序,最后调用merge方法将左右两个有序子序列合并成一个有序序列。 merge方法是归并排序的核心方法,它接收一个待排序的数组arr和数组的左右边界left、mid和right。在方法中,首先创建一个临时数组temp,然后使用两个指针i和j分别指向左右两个子序列的起始位置,使用一个指针k指向临时数组的起始位置。接着,比较左右两个子序列的当前元素大小,将较小的元素放入临时数组中,并将对应指针向后移动一位。最后,将剩余的元素依次放入临时数组中,再将临时数组中的元素复制回原数组中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄烤红薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值