排序03---[归并排序&&归并&&分离]

1.归并排序(Merge Sort)

1.1简介

 

 

 1.2归并排序--divide实现

 

 

 1.3归并排序--merge

 

 

 

 1.4 归并排序--merge细节

 

 

 1.5归并排序--merge

 

 

 1.6归并排序--merge--左边先结束

 

 1.7归并排序右边先结束

 

 1.8归并排序--merge实现

 

 1.9归并排序--复杂度分析

 

 1.10常见的递推式与复杂度

 

1.11代码

@Override
    protected void sort() {
        leftArray = (T[]) new Comparable[array.length >> 1];
        sort(0, array.length);
    }
    
    // T(n) = T(n/2) + T(n/2) + O(n)
    
    /**
     * 对 [begin, end) 范围的数据进行归并排序
     */
    private void sort(int begin, int end) {
        if (end - begin < 2) return;
        
        int mid = (begin + end) >> 1;
        sort(begin, mid);
        sort(mid, end);
        merge(begin, mid, end);
    }
    
    /**
     * 将 [begin, mid) 和 [mid, end) 范围的序列合并成一个有序序列
     */
    private void merge(int begin, int mid, int end) {
        int li = 0, le = mid - begin;
        int ri = mid, re = end;
        int ai = begin;
        
        // 备份左边数组
        for (int i = li; i < le; i++) {
            leftArray[i] = array[begin + i];
        }
        
        // 如果左边还没有结束
        while (li < le) { 
            if (ri < re && cmp(array[ri], leftArray[li]) < 0) {
                array[ai++] = array[ri++];
            } else {
                array[ai++] = leftArray[li++];
            }
        }
    }
View Code

 

1.12作业

 

posted @ 2020-03-24 09:29  从来不虚场合  阅读(200)  评论(0编辑  收藏  举报