归并排序

在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        int[] arr = {2,3,1,4,5,0,9,8,7,6};
        mergerSort(arr,0,arr.length-1);
        for(int i:arr){
            System.out.print(i);
        }
    }
    public static void mergerSort(int arr[],int start,int end){
        if(start == end){
            return;
        }
        int index = (end+start)/2;//取中间的元素的下标,以下标为分割线,将数组分成两部分

        mergerSort(arr,0,index);//递归拆左边的数组
        int LeftStart = start; //左边数组的开始
        int LeftEnd = index;    //左边数组的结束

        mergerSort(arr,index+1,end); //递归拆右边的部分
        int RightStart = index+1; //右边数组的开始
        int RightEnd = end;  //右边数组的结束

        int left = LeftStart;  //未雨绸缪。这里先保存旧数组的开始,把排好序的新数组会赋值给旧数组。

        int newArray[] = new int[RightEnd-LeftStart+1]; //定义一个新数组(新数组的长度就是右边数组的结束和左边数组开始之差)
        int num=0;//新数组的下标
        while(LeftStart <= LeftEnd && RightStart <= RightEnd){ //左边数组开始的下标不能大于左边数组结束的下标,右边同理。
            if(arr[LeftStart] > arr[RightStart]) { //已知左边数组和右边数组已经拍好序,所以当左边数组的开始大于右边数组的开始时,由于是升序就将右边数组的开始赋值给新数组。
                newArray[num] = arr[RightStart];
                RightStart++;
            }else{
                newArray[num] = arr[LeftStart]; //否则将左边数组的开始赋值给新数组
                LeftStart++;
            }
            num++;
        }
        //两边数组不一样长时
        if(RightStart>RightEnd){ //如果右边数组的开始大于右边数组的结束时,也就是说右边数组已经走完
            while(LeftStart<=LeftEnd){   //左边数组开始小于左边数组结束时,(也就是右边数组已经走完,只剩下左边数组时,将剩下的左边数组赋值给新数组)
                newArray[num] = arr[LeftStart];
                LeftStart++;
                num++;
            }
        }else {
            while(RightStart<=RightEnd){   //当右边数组长于左边数组时,将右边数组剩下元素给左边数组
                newArray[num] = arr[RightStart];
                RightStart++;
                num++;
            }
        }
        for(int i =0;i<newArray.length;i++){   //最后将新数组赋值给旧数组。
            arr[left] = newArray[i];  //把新数组赋给旧数组
            left++;         //这里的left是上面保存的旧数组的开始
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值