归并排序(Merge Sort)也称为合并排序。合并排序是建立在归并操作上的一种有效的排序算法。该算法也是采取分治(Divide and Conquer)的思想。合并算法是将两个(或两个以上)有序表合并成一个新的有序表,即把带排序的序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

算法描述:

1,申请空间,使其大小为两个已经排序序列的大小之和,该空间用来存放合并后的序列。

2,设定两个指针,最初位置分别为两个已经排序序列的起始位置。

3,比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动到下一位置。

4,重复步骤3直到某一指针到达序列尾。

5,将另一序列剩下的所有元素直接复制到合并序列尾。

动图演示:

代码实现:

public class Sort{
    public static void printArr(int[] arr){
        for(int i:arr){
            System.out.print(i+" ");
        }
    }

    public static void mergeSort(int[] arr,int low,int high){
        int mid=(low+high)/2;
        if(low<high){
            mergeSort(arr,low,mid);
            mergeSort(arr,mid+1,high);
            merge(arr,low,mid,high);
        }
    }

    public static void merge(int[] arr,int low,int mid,int high){
        int i=low,j=mid+1,k=0;
        int[] temp=new int[high-low+1];
        while(i<=mid&&j<=high){
             if(arr[i]<arr[j]){
                temp[k++]=arr[i++];
             }else{
                temp[k++]=arr[j++];
             }
        }
        while(i<=mid){
             temp[k++]=arr[i++];
        }
        while(j<=high){
             temp[k++]=arr[j++];
        }
        for(int m=0;m<high-low+1;m++){
             arr[low+m]=temp[m];
        }
    }
         
    public static void main(String[] args){
        int[] arr=new int[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
        int low=0;int high=arr.length-1;
        mergeSort(arr,low,high);
        printArr(arr);
    }
}

 

 posted on 2018-07-17 21:24  会飞的金鱼  阅读(691)  评论(0)    收藏  举报