数据结构之排序算法(二)

     // 归并排序
    //  自顶向下  归并过程


    function Merge(arr, l, mid, r) {
        var newArr = []

        var x = l;
        var y = mid +1;
        while(x<= mid && y<= r){
            if(arr[x] < arr[y]){
                newArr.push(arr[x++])
                
            } else{
                newArr.push(arr[y++]);
    
            }
        }

        while(x <= mid){
            newArr.push(arr[x++]);    
        }

        while(y <= r) {
            newArr.push(arr[y++]);
        }

        for(var i=0,len=newArr.length; i<len ; i++) {
            arr[i+l] = newArr[i]
        }
    }

    function MergeSort(arr, l, r){
        if( l >= r) {
            return ;
        }
        var mid = Math.floor((l + r) / 2);
        
        MergeSort(arr, l, mid);
        MergeSort(arr, mid+1, r);
        // 如果arr[mid] < arr[mid+1] 则说明 arr 已经有序了
         if( arr[mid] > arr{mid+1}) {
            Merge(arr, l, mid, r);
        }
        
    }

    // 自底向上 的 归并排序算法
    function MergeSortBU(arr, n) {
        for(var sz=1; sz<n; sz += sz)
            for(var i=0; i + sz <n; i += sz +sz)
                Merge(arr, i, i+sz-1, min(i + sz + sz-1, n-1))
    }

    // 最小值
    function min(a, b){
        return a > b ? b : a;
    }

自底向上的归并算法,是一个很神奇的东西

刚开始的时候,不是很理解,感觉像是颠覆了之前的想法思维

从底往上  刚开始是相邻的比较  再通过sz 的变大,比较的范围也变大了

猜你喜欢

转载自blog.csdn.net/qq_39081958/article/details/81737699