排序--MergeSort 归并排序?

  MergeSort 's implementationjava

  MergetSort 的中心思想就是分治思想,经过解决每个小问题来解决大问题git

  假设你有2个已经排好序的数组github

  数组[ 4 ][ 8 ] 和 数组[ 5 ][ 7 ] 进行排序算法

  4 是第一个数组最小的值  和 第二个数组最小的值5 进行比较 4 < 5 因此最小的元素是4数组

  排完第一个元素后是[ 4 ][ null ][ null ][ null ]less

  接着排第二个元素, 8 和 5 比较。5 比较小ide

  因此是 [ 4 ][ 5 ][ null ][ null ],接着 第一个数组最小的值8 和第二个数组最好的值7 比较。 7  < 8spa

  因此变成 [ 4 ][ 5 ][ 7 ][ 8 ]。指针

  因此问题的关键就是先把2个 数组分别排序了。再merge到一个大的数组中。下面盗用一下别人的图。嘎嘎嘎code

    

  mergeSort的复杂度为NLgN。至关快的算法。而且是stable

  下面给出具体的实现

  

    //Time : N log(N) & wasting space that proportional to N
    public static void sort(Comparable[] a) {
        sort(a, new Comparable[a.length], 0, a.length - 1);
    }
    
    //mid 的左右都已是有序的了,
    //这个是merge方法
    //a 和辅助 数组的长度须要一致
    /**            i            j  
      *             []  []  []  [ ]  []
     *             low     mid    hi   
     */
    private static void sort(Comparable[] a, Comparable[] aux, int low, int hi) {
        if (low >= hi) return;
        int middle = low + (hi - low) / 2;
        sort(a, aux, low, middle); //sort left
        sort(a, aux, middle + 1, hi); // sort right
        merge(a, aux, low, middle, hi);
    }
    
    /**            i              j  
      *            [ ]  [ ]  [ ]  [ ]  [ ]
     *            low       mid        hi   
     */
    private static void merge(Comparable[] a, Comparable[] aux,int low, int middle, int hi) {
        int i = low;
        int j = middle + 1;
        for (int k = low; k <= hi; k++)
            aux[k] = a[k];   //把元素复制到辅助数组上
        
        for (int k = low; k <= hi; k++) {
            
            //前面2个判断条件必定要在前面。
            //要否则下面比较的时候 会出现空指针异常
            //由于已经有可能j 已经超出了hi的大小
            if (i > middle) a[k] = aux[j++];
            else if (j > hi) a[k] = aux[i++];
            else if (less(aux[i],aux[j])) a[k] = aux[i++]; //
            else a[k] = aux[j++];
        }
    }
merge sort

https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/MergeSort.java

相关文章
相关标签/搜索