幾種排序算法的JavaScript實現

/**
 * Created by lzc on 2017/4/30.
 */

var a = (function (){
    var a = [];
    function randomInt(from, to){
        return parseInt(Math.random() * (to - from + 1) + from);
    }
    for (var i = 0; i < 10000; i++){
        a.push(randomInt(0, 1000000))
    }
    return a;
})();

/**
 * 插入排序
 */
function insertionSort(){
    var date = new Date();
    for (var i = 1; i < a.length; i++){
        var temp = a[i];
        for (var j = i - 1; j >= 0 && a[j] > temp; j--){
            a[j + 1] = a[j];
        }
        a[j + 1] = temp;
    }
    console.log("插入排序的時間:" + (new Date() - date));
}
/**
 * 希爾排序
 */
function shellSort(){
    var date = Date.now();
    for (var gap = a.length >> 1; gap > 0; gap >>= 1){
        for (var i = gap; i < a.length; i++){
            var temp = a[i];
            for (var j = i - gap; j >= 0 && a[j] > temp; j -= gap){
                a[j + gap] = a[j];
            }
            a[j + gap] = temp;
        }
    }
    console.log("希爾排序的時間:" + (new Date() - date));
}
/**
 * 歸併
 * @param a
 * @param b
 * @param lo
 * @param mid
 * @param hi
 */
function merge(a, b, lo, mid, hi){
    //每次歸併前,都需要先把a中的數據copy到b中。
    for (var i = 0; i < a.length; i++){
        b[i] = a[i];
    }
    var i = lo, j = mid + 1;
    for (var k = lo; k <= hi; k++){
        if (i > mid){
            a[k] = b[j++];
        }else if (j > hi){
            a[k] = b[i++];
        }else if (b[i] < b[j]){
            a[k] = b[i++];
        }else{
            a[k] = b[j++]
        }
    }
}
/**
 * 歸併排序
 * @param a
 * @param temp
 * @param lo
 * @param hi
 */
function sort(a, temp, lo, hi){
    if (lo >= hi) return;
    var mid = (hi + lo) >> 1;
    sort(a, temp, lo, mid);  //左半部分排序
    sort(a, temp, mid + 1, hi);//右半部分排序
    merge(a, temp, lo, mid, hi);
}

/**
 * 快速排序
 */
function quickSort(a, lo, hi){
    if (lo >= hi) return;
    var j = quickPartition(a, lo, hi);
    quickSort(a, lo, j - 1);
    quickSort(a, j + 1, hi);
}
/**
 * 快速排序的切分
 * @param a
 * @param lo
 * @param hi
 */
function quickPartition(a, lo, hi){
    var i = lo, j = hi + 1;  //左右掃描指針
    var p = a[lo];  //切分元素
    for (; ;){
        //掃描左右,檢查掃描是否結束,並交換元素
        while (a[++i] <= p){
            if (i == hi) break;

        }
        while (a[--j] >= p){
            if (j == lo) break;
        }
        //如果左指針超過了右指針則結束
        if (i >= j) break;
        //交換左右的元素
        exch(a, i, j);
    }
    //把a[lo]添加到指定的位置
    exch(a, lo, j);
    return j;
}
function exch(a, m, n){
    var temp = a[m];
    a[m] = a[n];
    a[n] = temp;
}

//--測試開始
var date = new Date()
quickSort(a, 0, a.length - 1);
console.log("快速排序時間:" + (new Date() - date));
console.log(a.toString());
發佈了79 篇原創文章 · 獲贊 375 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章