zoukankan      html  css  js  c++  java
  • 排序算法之--归并排序

    思想:

    归并排序 是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

    可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。

    治:

    上代码:

     //
         public static void mergesort(int []data,int left,int right) //;left right
         {
             //左         右
             //0  1  2  3 4  5
              if(left >= right)
              {
                  return;//一个元素,
              }
              int center=(right+left)/2;//切半
              mergesort(data,left, center);//左边
              mergesort(data, center+1,right);//左边右边
              merge(data,left,center,right);     //归并  
         }
     //
          public static void merge(int []data,int left,int  center ,int right)
          {
              //left  -center      center +1   right
              int [] tempdata=new int [data.length];//创建临时数组,归并
              int mid=center+1;//两个数组分割线
              int temppos=left;//临时数组的索引,0->
              int  templeft=left;//左边数组的索引
              
              while( left<=center   && mid<=right )//处理两个数组归并
              {
                  if(data[left] <=data[mid])
                  {
                      tempdata[temppos]=data[left];//保存小的数据
                      temppos++;
                      left++;
                      
                      
                  }
                  else
                  {
                      tempdata[temppos]=data[mid];//保存小的数据
                      temppos++; 
                      mid++;
                  }
              }
              //没有结束的链接起来
              while(mid<=right)
              {
                   tempdata[temppos]=data[mid];
                    temppos++; 
                    mid++;//移动
              }
              while(left<=center)
              {
                     tempdata[temppos]=data[left];
                    temppos++; 
                    left++;//移动
              }
              while(templeft<=right)//拷贝回去
              {
                  data[templeft]=tempdata[templeft];
                  templeft++;
              }
              
          }

     参考:

    https://www.cnblogs.com/chengxiao/p/6194356.html

  • 相关阅读:
    基于JavaFXWJFXGameEngine游戏引擎介绍与进度
    进程线程与cpu绑定
    [Vim练级攻略] Vim基础操作
    hdu 2159 fate
    python的httplib注意事项
    SQL优化总结
    项目整体开发流程以及配置人员
    hdu 1010 解题报告 Tempter of the Bone
    在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
    int 和bigint差别有多大?
  • 原文地址:https://www.cnblogs.com/symkmk123/p/9486496.html
Copyright © 2011-2022 走看看