归并排序

package com.study.sort;

import java.util.Arrays;

/**
 * 参考:https://www.cnblogs.com/chengxiao/p/6194356.html
 *8  4  5  7  1  3  6  2
 *1、将原始数组分割为最小数组序列,先将子序列进行排序,然后向上归并;
 *
 * mergeItemStart==>:startIndex:0   midIndex:0  endIndex:1 handLen:2
 * array:  ->8  4  5  7  1  3  6  2
 * mergeItemIng=================
 * temp:  ->4  8
 * array:  ->4  8  5  7  1  3  6  2
 * mergeItemEnd=================
 *
 *
 * mergeItemStart==>:startIndex:2   midIndex:2  endIndex:3 handLen:2
 * array:  ->4  8  5  7  1  3  6  2
 * mergeItemIng=================
 * temp:  ->5  7
 * array:  ->4  8  5  7  1  3  6  2
 * mergeItemEnd=================
 *
 *
 * mergeItemStart==>:startIndex:0   midIndex:1  endIndex:3 handLen:4
 * array:  ->4  8  5  7  1  3  6  2
 * mergeItemIng=================
 * temp:  ->4  5  7  8
 * array:  ->4  5  7  8  1  3  6  2
 * mergeItemEnd=================
 *
 *
 * mergeItemStart==>:startIndex:4   midIndex:4  endIndex:5 handLen:2
 * array:  ->4  5  7  8  1  3  6  2
 * mergeItemIng=================
 * temp:  ->1  3
 * array:  ->4  5  7  8  1  3  6  2
 * mergeItemEnd=================
 *
 *
 * mergeItemStart==>:startIndex:6   midIndex:6  endIndex:7 handLen:2
 * array:  ->4  5  7  8  1  3  6  2
 * mergeItemIng=================
 * temp:  ->2  6
 * array:  ->4  5  7  8  1  3  2  6
 * mergeItemEnd=================
 *
 *
 * mergeItemStart==>:startIndex:4   midIndex:5  endIndex:7 handLen:4
 * array:  ->4  5  7  8  1  3  2  6
 * mergeItemIng=================
 * temp:  ->1  2  3  6
 * array:  ->4  5  7  8  1  2  3  6
 * mergeItemEnd=================
 *
 *
 * mergeItemStart==>:startIndex:0   midIndex:3  endIndex:7 handLen:8
 * array:  ->4  5  7  8  1  2  3  6
 * mergeItemIng=================
 * temp:  ->1  2  3  4  5  6  7  8
 * array:  ->1  2  3  4  5  6  7  8
 * mergeItemEnd=================
 * ============end
 * 1  2  3  4  5  6  7  8
 */
public class MergeSort extends BaseSort{
    public static void main(String[] args) {
        isPrint=true;
        int len=10;
//        int []array=genArray(len);
        int []array=new int[]{8,4,5,7,9,1,3,6,2};

        p(array);
        mergeSort(array,0,array.length-1);

        System.out.println("============end");
        p(array);
    }

    public static  void mergeSort(int array[],int startIndex,int endIndex){

        if(startIndex<endIndex){
            int mid=(startIndex+endIndex)/2;
            mergeSort(array,startIndex,mid);
            mergeSort(array,mid+1,endIndex);
            merge(array,startIndex,mid,endIndex);
        }else {
            //只有相等的情况
        }
    }

    /**
     *
     *
     * @param array 原始数组
     * @param startIndex  该次排序数组在原数组中的起始下标
     * @param midIndex    该次排序数组在原数组中的mid下标
     * @param endIndex    该次排序数组在原数组中的终止下标
     */
    public static  void merge(int array[],int startIndex,int midIndex,int endIndex){
       // 每次新建一个临时数组,将左数组和有数组里的数据按照顺序填充到临时数组temp;
        int []temp =new int[endIndex-startIndex+1];
        System.out.println("\n\nmergeItemStart==>:startIndex:"+startIndex+"   midIndex:"+midIndex+"  endIndex:"+endIndex +" handLen:"+temp.length);
        p("array:",array);
        System.out.println("mergeItemIng=================" );
        int i=startIndex;int j=midIndex+1;
     int t=0;
     while(i<=midIndex&&j<=endIndex){
         if(array[i]<array[j]){
             temp[t++]=array[i++];
         }else {
             temp[t++]=array[j++];
         }
     }
     //需考虑左数组和右数组不一样长的情况;
     while (i<=midIndex){
         temp[t++]=array[i++];
     }
     while (j<=endIndex){
         temp[t++]=array[j++];
     }
     t=0;
     //将排序好的临时数组拷贝到原始数组
     while (startIndex<=endIndex){
         array[startIndex++]=temp[t++];
     }

        p("temp:",temp);
        p("array:",array);
        System.out.println("mergeItemEnd=================" );
    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值