Javascript实现各类数组排序算法

Javascript代码:

/**
 * Created by qiuleo on 15/6/17.
 */

/**
 * @description 生成随机数的数组,用作排序测试使用
 * @param len
 * @param from
 * @param to
 * @returns {Array}
 */
function makeRandArr(len, from, to) {
    from = from || 0;
    to = to || 100;
    var result = [], i = 0;
    if (len == 0) {
        return [];
    }
    for (; i < len; i++) {
        result.push(Math.floor(Math.random() * ( to - from + 1) - from));
    }
    return result;
}

/**
 * @description 定义console对象的timeStat计时器
 */
function defineConsoleTime() {
    if (typeof console.timeStat === 'undefined') {
        Object.defineProperty(console, 'timeStat', {
            writeable: true,
            enumerable: false,
            configurable: false,
            value: function () {
                var spent;
                if (this.timeStampStat === undefined) {
                    this.timeStampStat = Date.now();
                    spent = 0;
                } else {
                    var spent = Date.now() - this.timeStampStat;
                    this.timeStampStat = Date.now();
                }
                return spent;
            }
        });
    }

}

/**
 * @description 测试函数 runTest(bubbleSort, 'desc', 30);
 * @param sortfunction
 * @param dir
 * @param arrlen
 * @param from
 * @param to
 */
function runTest(sortfunction, dir, arrlen, from, to) {
    arrlen = arrlen || 1000;
    var arr = makeRandArr(arrlen, from, to);
    if (arr === []) {
        throw TypeError('Array\'s len must be great than zero');
    }
    if (typeof sortfunction !== 'function') {
        throw TypeError('Function `' + sortfunction + '` have not defined yet');
    }
    defineConsoleTime();
    console.timeStat();
    var arg = [arr, dir];
    var result = sortfunction.apply(null, arg);
    console.log(result);
    console.log('Array\'s length is ' + result.length + ', spent times : ', console.timeStat());
}

/**
 * @description 快速排序实现
 * @param arr
 * @param dir
 * @returns {*}
 */
function quickSort(arr, dir) {
    dir = dir || 'asc';
    if (arr.length === 0) {
        return [];
    }
    var left = [], right = [], first = arr[0], i = 1;
    if (dir === 'asc') {
        for (; i < arr.length; i++) {
            arr[i] < first ? left.push(arr[i]) : right.push(arr[i]);
        }
    } else {
        for (; i < arr.length; i++) {
            arr[i] > first ? left.push(arr[i]) : right.push(arr[i]);
        }
    }

    return sort(left, dir).concat(first, sort(right, dir));
}

/**
 * @description 插入排序算法实现
 *  时间复杂度:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。
 *  最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。
 *  最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。
 *  插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。
 *  因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,
 *  例如,量级小于1000,那么插入排序还是一个不错的选择。
 * @param arr
 * @param dir
 * @returns {*}
 */
function insertSort(arr, dir) {
    var len = arr.length, dir = dir || 'asc', i = 1, tmp, j;
    if (!len) {
        return [];
    }
    if (dir === 'asc') {
        for (; i < len; i++) {
            tmp = arr[i];
            j = i - 1;
            while (arr[j] > tmp) {
                arr[j + 1] = arr[j];
                arr[j] = tmp;
                j--;
            }
        }
    } else {
        for (; i < len; i++) {
            tmp = arr[i];
            j = i - 1;
            while (arr[j] < tmp) {
                arr[j + 1] = arr[j];
                arr[j] = tmp;
                j--;
            }
        }
    }
    return arr;
}

/**
 * @description 选择排序算法实现
 *  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
 * @param arr
 * @param dir
 */
function selectSort(arr, dir) {
    var len = arr.length, dir = dir || 'asc', i = 0, k, tmp, j;
    if (!len) {
        return [];
    }
    if (dir === 'asc') {
        for (; i < len; i++) {
            for (j = i + 1; j < len; j++) {
                if (arr[i] > arr[j]) {
                    tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
    } else {
        for (; i < len; i++) {
            for (j = i + 1; j < len; j++) {
                if (arr[i] < arr[j]) {
                    tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
    }
    return arr;
}

/**
 * @description 冒泡排序算法实现
 *  两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
 *  该算法的时间复杂度为O(n2)。但是,当原始关键字序列已有序时,只进行一趟比较就结束,此时时间复杂度为O(n)。
 * @param arr
 * @param dir
 */
function bubbleSort(arr, dir) {
    var len = arr.length, dir = dir || 'asc', i, j, tmp;
    if (!len) {
        return [];
    }
    if (dir === 'asc') {
        for (i = 0; i < len; i++) {
            for (j = len - 1; j > i; j--) {
                if (arr[j] < arr[j - 1]) {
                    tmp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = tmp;
                }
            }
        }
    }else{
        for (i = 0; i < len; i++) {
            for (j = len - 1; j > i; j--) {
                if (arr[j] > arr[j - 1]) {
                    tmp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = tmp;
                }
            }
        }
    }

    return arr;
}

/**
 * @description 堆排序算法实现
 * @param arr
 * @param dir
 */
function heapSort(arr, dir) {

}

/**
 * @description 归并算法实现
 * @param arr
 * @param dir
 */
function mergeSort(arr, dir) {

}

/**
 * @description 基数算法实现
 * @param arr
 * @param dir
 */
function radixSort(arr, dir) {

}

runTest(bubbleSort, 'desc', 30);

 

posted @ 2015-06-18 22:33  qiuleo  阅读(244)  评论(0编辑  收藏  举报