排序-----归并排序(java)

一:什么是归并排序

    对一个数组进行排序,可以递归的将其分成两半分别进行排序,带有序之后,再将二者进行合并(两个有序数组的合并)。

    使用递归,将数组依次进行分组,直至分到一个元素一组,然后进行归并,两两归并,四四归并,直到完全归并,在归并的过程中,待归并的两个子数组 组内元素有序(相当于将两个有序的数组进行合并)。



二:代码实现

public class Merge {
    private static int[] a ={20,45,2,1,43,3,91,2,65,19,30,1,47,89,56,11};
    private static int[] aux; /**归并过程中的辅助数据*/
    public static void main(String args[]){
        aux = new int[a.length];
        Mergesort(a,0,a.length-1);
        show(a);
    }

    private static void Mergesort(int[] a, int m, int n) {
        if(n<=m) return;
        int mid = m +(n-m)/2;
        Mergesort(a,m,mid);
        Mergesort(a,mid+1,n);
        merge(a,m,mid,n);

    }

    private static void show(int[] aux) {
        System.out.println("排序结果为");
        for(int i=0;i<aux.length;i++){
            System.out.print(aux[i]+",");
        }
    }

    /**合并 本质上就是两个有序数组进行合并*/
    private static void merge(int[] a, int m, int mid, int n) {
        int i=m;
        int j=mid+1;
        for(int k=i;k<=n;k++){
            aux[k] = a[k];           //将待归并的数据放置到辅助数据中
        }
        for(int k =m;k<=n;k++){
            if(i>mid) a[k] = aux[j++]; //左边已经归并完
            else if(j>n) a[k] =aux[i++];//右边已经归并完
            else if(less(aux[i],aux[j])) a[k] = aux[i++];
            else a[k] = aux[j++];
        }
    }

    private static boolean less(int i, int j) {
        if(i<j){
            return true;
        } else {
            return false;
        }
    }

}

    我们可以使用归并排序算法处理数组规模较大的情况,可以处理数百万甚至更大的数组规模。缺点是辅助数组所使用的额外空间和N的大小成正比。


猜你喜欢

转载自blog.csdn.net/jz_say/article/details/80203253