归并排序

/**
     * 归并排序
     * 核心思想:找到数组中间下标位置,分成两个数组;
     *        继续找中间位置下标位置,分成两个数组;
     *        迭代
     *        合并
     * @param args
     */
    public void mergeSort(int [] array) {
        if(array != null && array.length !=0) {
            mergeSort(array,0,array.length-1);
        }
    }
    private void mergeSort(int[] array, int left, int right) {
        if(left<right) {
            int middle = (left+ right)/2;
            //下标left 到 middle
            mergeSort(array,left,middle);
            //下标middle+1到 right
            mergeSort(array,middle+1,right);
            //合并
            merge(array,left,middle,right);
        }
    }
    /**
     * 合并:
     *    迭代从最内层考虑:
     *    只有两个元素,则直接比较,排位即可;
     *    依次增多两个(排好序的)数组的元素个数,考虑多种情况,相互合并
     * @param array
     * @param left
     * @param middle
     * @param right
     */
    private void merge(int[] array, int left, int middle, int right) {
        int [] tempArray = new int[array.length];
        int rightStart = middle +1;
        int temp = left;
        int third = left;
        while(left<=middle && rightStart<=right) {
            if(array[left]<=array[rightStart]) {
                tempArray[third++] = array[left++];
            }
            if(array[left]>=array[rightStart]) {
                tempArray[third++] = array[rightStart++];
            }
        }
        //left 到 middle 元素没有全部 ,添加进tempArray
        while(left<=middle) {
            tempArray[third++] = array[left++];
        }
        //middle+1 到 right 元素没有全部 ,添加进tempArray
        while(rightStart<=right) {
            tempArray[third++] = array[rightStart++];
        }
        //这里的把tempArray 赋值给 array 为什么不用 array = tempArray
        while(temp <=right) {
            //把所有参与比较的元素,排好序,重新赋值给原数组
            array[temp] = tempArray[temp++];
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值