排序之归并排序(递归)

归并排序:(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
逆序数为14;
递归思路:设置 mid参数,将归并排序分成左右两部分来做
 借用已经写好的归并排序算法,将mid左右两部分分别排序,
设置递归的出口为first =last,这样便达到递归的效果了。
递归的过程:

测试代码:

public class Myguibing {
//排序函数
    public static void  merge(int[]a,int first,int mid,int last,int[]x)
    {
        int i=first;
        int m=mid;
        int j=mid+1;
        int n=last;
        int xi=0;//暂时存放数组
        
        while(i<=m&&j<=n)
        {
        if(a[i]<=a[j])
        x[xi++]=a[i++];
        else
            x[xi++]=a[j++];
        }
        while(i<=m)x[xi++]=a[i++];
        while(j<=n)x[xi++]=a[j++];
        
        for(i=0;i<xi;i++) a[first+i]=x[i];
    }
    //递归的把数组划分为两个子数组,一直递归到数组中只有一个元素
    static void diguisort(int a[],int first,int last,int xi[])
    {
        if(first<last)//设置递归出口
        {
            int mid=(first+last)/2;
            diguisort(a,first,mid,xi);//左边
            diguisort(a,mid+1,last,xi);//右边
            merge(a,first,mid,last,xi);//调用归并排序函数,两个有序数组排序import java.util.Scanner;
        }
    }
      public void sort(int[] a) {  
            int n=a.length;  
            int[] b=new int[n];  
            diguisort(a, 0, n-1, b);  
        }  
    public static void main(String[] args) {
            
             int[] a= {10,9,8,35,6,39,47,3};  
             int[] b= {12,39,83,325,62,392,417,23};  
             Myguibing p1=new Myguibing();  
              p1.sort(a);  
              p1.sort(b);
              System.out.println("输入数组经排序后为:");
                for (int i : b)
              {  
                  System.out.print(i+" ");  
              }
               
    }
}

猜你喜欢

转载自www.cnblogs.com/nulinulizainuli/p/10526189.html