归并排序

作者: 知识学者 | 来源:发表于2018-04-06 11:20 被阅读10次

    归并排序,采用分治法。首先采用递归,把数组分成一小段有序,然后再把有序的数组一一合并。

    首先看看,把有序的二个数组,合成一个的算法。

    
    package day20180406;
    
    public class GuibingDem {
    
        public static void main(String[] args) {
        
            int[] test1= {1,3,5};
            int[] test2= {-8,8,16,26,88};
            int[] c=new int[8];
            hebing(test1,test2,c);
            print(c);
        }
        
    
    // 把二个有序的数组合并   
        static void hebing(int[] a,int[] b,int[] c)
        {
            int i=0,j=0;
            int k=0;
            while(i<a.length&&j<b.length)
            {
                if(a[i]<b[j])
                {
                    c[k]=a[i];
                    k++;
                    i++;
                }else
                {
                    c[k]=b[j];
                    k++;
                    j++;
                }
                
            }
            
        while(i<a.length)
        {
            c[k]=a[i];
            k++;
            i++;
        }
            
        while(j<b.length)
        {
            c[k++]=b[j++];
        }
        
        }
        
        static void print(int[] arry)
        {   
            
            for(int i=0; i<arry.length; i++)
            System.out.print(" "+arry[i]);
        }
    
    }
    
    

    结果

     -8 1 3 5 8 16 26 88
    

    归并排序

    package day20180410;
    
    import java.util.ArrayList;
    
    public class DuipaiDem {
    
        public static void main(String[] args) {
              int[] arry= {1,288,311,400,5,88,89,100};
              int[] b=new int[arry.length];
              System.out.println();
              display(arry);
          sort(arry,0,arry.length-1);
             display(arry);
         //    addSort(arry,b,0,arry.length/2,arry.length-1);
         //    display(b);
              
        }
        
        
     //归并排序
        static void sort(int[] arr,int left,int right)
        {
            int mid;
            int[] num=new int[arr.length];
            if(left==right)
            {
                return ;
            }else {
                mid=(left+right)/2;
                //左边归并排序
                sort(arr,left,mid);
                //右边归并排序
                sort(arr,mid+1,right);
                //合并有序的子数组。
                addSort(arr,num,left,mid,right);
                
            }
            for(int i=left; i<right+1; i++)
            {
                arr[i]=num[i];
            }
        
        }
        
        
        //数组合并
        static void  addSort(int[] a,int[] b,int left,int med,int right)
        {
            int i=left,j=med+1,k=left;
            
         while(i<=med&&j<=right)
         {
            if(a[i]<a[j])
            {
                b[k++]=a[i++];
            }else
            {
            //这里写太快了,写成b[k++]=b[j++];导致,bug了半个多小时
                b[k++]=a[j++];
            }
              
         }
         
         while(i<=med)
         {
             b[k++]=a[i++];
         }
         while(j<=right)
         {
             b[k++]=a[j++];
         }
         
        /*
    
         for(int m=left; m<right+1; m++)
        
         {
             a[m]=b[m];
         }
         
         */
        }
        
        //打印数组
        static void display(int[] a)
        {
            for(int num:a)
            {
                System.out.print(" "+num);
            }
            
            System.out.println();
            
        }
    
            
    }
    
    

    结果

    
     1 288 311 400 5 88 89 100
     1 5 88 89 100 288 311 400
    
    

    相关文章
    归并排序原理及Java实现
    Java实现归并排序

    大同小异,思路差不多。

    相关文章

      网友评论

        本文标题:归并排序

        本文链接:https://www.haomeiwen.com/subject/kanjhftx.html