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

  • 相关阅读:
    Golang的select多路复用以及channel使用实践
    golang-goroutine和channel
    golang类型转换小总结
    golang之终端操作,文件操作
    golang之结构体和方法
    golang基础之三-字符串,时间,流程控制,函数
    Linux Keepliaved安装
    Git打标签、还原到具体标签版本代码
    Git复制已有分支到新分支开发
    记一次内存分析
  • 原文地址:https://www.cnblogs.com/symkmk123/p/9486496.html
Copyright © 2011-2022 走看看