算法学习-归并排序

* 思想

       归并排序的核心思想:将两个有序的数列进行合并,那么如何获得有序的数列便值得我们思考了,如果一个序列中只有一个元素那便是有序的,这里我们用到了分治的思想;我们将其合并,形成一个相对的有序的数列,在这个过程中我们用到了递归;这时我们将小队列逐次合并,便得到最终有序的数列。


* 图解

       上面的话,小编认为着实有些绕口和生硬,于是想要通过一个具体的demo描述一下获得有序的数列,同时如何逐次合并的过程。(小编认为这张图是本博文的精髓)

这里写图片描述

       对原数组进行排序,我们的执行顺序按照红色编号,从1-25,其中体现分治和递归的思考。虽然我们描述中说的是程序先分解,再归并,但实际过程是一边分解一边归并,前半部分分先排好序,后半部分再排,最后整个归并为一个完整的序列,整个过程就像一个动态的树,执行顺序就是对树的先序遍历顺序。


* java code

       将理论落实下来最好的办法便是把你所想的用代码体现出来,代码如下,欢迎大家赏读(赏脸阅读)

/**
 * 归并排序合并--lyw--2018年8月30日15:34:05
   * @param b
   * @param begin
   * @param middle
   * @param end
   */
   public void merge(int[] b,int begin,int middle,int end){
      int i=0;
      int j=0;

      int[] left= Arrays.copyOfRange(b,begin,middle+1);
      int[] right=Arrays.copyOfRange(b,middle+1,end+1);

      int k=begin;
      while ((i<left.length) &&j<right.length){
          if (left[i]<right[j]){
              b[k++]=left[i];
              i++;
          }else  {
              b[k++]=right[j];
              j++;
          }
      }

      if (i<left.length){
          b[k++]=left[i];
      }
      if (j<right.length){
          b[k++]=right[j];
      }
   }

  /**
   * 归并排序--lyw--2018年8月30日15:46:39
   * @param b
   * @param begin
   * @param end
   */
   public void mergeSort(int[] b,int begin,int end){
      if (begin<end){
          int middle=(begin+end)/2;
          mergeSort(b,begin,middle);
          mergeSort(b,middle+1,end);
          merge(b,begin,middle,end);
      }
   }

  /**
   * 测试归并排序--lyw--2018年8月30日15:49:25
   */
  @Test
   public void testMerge(){
       mergeSort(arr,0,8);
      //打印结果
      System.out.print("归并排序的结果:");
      for (int i=0;i<arr.length;i++){
          System.out.print(arr[i]+", ");
      }
   }

* 结语

       愿每一次的分享都会结果,自己接触到的东西也要有一个颗粒归仓,今天的对算法又熟悉了一些。

       感谢您宝贵的阅读时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值