/quickSort-mergeSort-heapSort-radixSort

非递归 快速排序 归并排序 堆排序 基数排序 的实现

quickSort-mergeSort-heapSort-radixSort

非递归 快速排序 归并排序 堆排序 基数排序 的实现

//快速排序
function quickSort( arr ) {
    var parts = [ [ 0, arr.length - 1 ] ];
    while ( parts.length ) {
        var part = parts.shift();
        var l = part[ 0 ];
        var r = part[ 1 ];
        if ( l >= r ) {
            continue;
        }
        var midx = l;
        var mid = arr[ midx ];
        for ( var i = l + 1; i <= r; i++ ) {
            if ( arr[ i ] < mid ) {
                var temp = arr.splice( i, 1 );
                arr.splice( midx, 0, ...temp );
                midx++
            }
        }
        parts.push( [ l, midx - 1 ], [ midx + 1, r ] );
    }
}
//归并排序
function mergeSort(arr) {
    var temp = [];
    for (var length = 2; length / 2 <= arr.length; length *= 2) {
        for (var start = 0; start < arr.length; start += length) {
            wrap(start, start + length - 1, temp);
        }
    }
    function wrap(begin, end, temp) {
        var mid = Math.floor((begin + end) / 2);
        var i = begin;
        var a = mid;
        var j = mid + 1;
        var b = end;
        var k = 0;
        while (i <= a && i <= arr.length - 1 && j <= b && j <= arr.length - 1) {
            arr[i] > arr[j] ? temp[k++] = arr[i++] : temp[k++] = arr[j++];
        };
        while (i <= a && i <= arr.length - 1) {
            temp[k++] = arr[i++];
        };
        while (j <= b && j <= arr.length - 1) {
            temp[k++] = arr[j++];
        };
        for (var kk = 0; kk < k; kk++) {
            arr[begin + kk] = temp[kk];
        }
    }
}
//堆排序
function heapSort(arr) {
    for (var i = arr.length - 1; i > 0; i--) {
        sort(i);
        adjust(i);
    }
    function sort(i) {
        // 父节点与子节点关系推导公式:
        // 假定子节点数组中的索引为i,父节点数组中的索引为p
        // 假定子节点在二叉树的第k+1层,那么父节点在二叉树的第k层
        // 假定子节点在所在层的第m个,那么父节点就是在所在层的第 m/2 (m是偶数)或 (m+1)/2 (m是奇数) 个
        // 所以 1 + 2 + 2**2 + 2**3 + ... + 2**k + m = i ; 1+2+2**2+...+2**(k-1) + m/2 = p (m是偶数) ; 1+2+2**2+...+2**(k-1) + (m+1)/2 = p (m是奇数)
        // 后面的试子左右乘以2,然后两个试子相减,就可以得出下面的对应关系
        var p = Math.floor((i - 1) / 2);
        while (p >= 0) {
            var l = 2 * p + 1;
            var r = l + 1;
            var max = l;
            var temp;
            if (r <= i && arr[r] > arr[l]) {
                max = r;
            }
            temp = arr[max];
            if (temp > arr[p]) {
                arr[max] = arr[p];
                arr[p] = temp;
            }
            p--;
        }
    }
    function adjust(i) {
        var temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
    }
}
//基数排序
function radixSort(arr,d){
    var radixArray=[[],[],[],[],[],[],[],[],[],[]];
    var bit = -1;
    while(bit++<=d){
        arr.forEach(function(item){
            var idx = Math.floor(item/Math.pow(10,bit))%10;
            radixArray[idx].push(item);
        });
        arr.length=0;
        radixArray.forEach(function(a){
            a.forEach(function(item){
               arr.push(item); 
            });
            a.length=0;
        });
    }
}