排序算法之--归并排序

思想:

归并排序 是利用归并的思想实现的排序方法,该算法采用经典的分治(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++;
          }
          
      }

猜你喜欢

转载自www.cnblogs.com/symkmk123/p/9486496.html