常見前端排序方式對比

首先須要一個自動生成數組的函數

// 自動生成數組的函數
    function randomArr (n) {
        let arr = [];
        for (let i = 1; i <= n; i++) {
            arr.push(Math.floor(Math.random() * (i + 1)));
        }
        return arr;
    }
  1. 執行上面函數,的到的arr1數組長度爲50000,由於js執行速度很快,只有長度很大時,才能看到各個方法的執行速度的差異
  2. 注意 arr2到arr6不能簡單的用賦值,不然arr1改變後,arr2到arr6也相應改變了
// 六個相同的數組 而且數組長度要足夠大才能對比出來
    let arr1 = randomArr(50000);
    let arr2 = [...arr1];
    let arr3 = [...arr1];
    let arr4 = [...arr1];
    let arr5 = [...arr1];
    let arr6 = [...arr1];

接下來是咱們常見的排序方式

// 選擇排序
    function pickSort (arr) {
        let temp;
        for (let i = 0; i < arr.length; i++) {
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

    // 冒泡排序
    function bubleSort (arr) {
        let temp, isSort;
        for (let i = 1; i < arr.length; i++) {
            isSort = false;
            for (let j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    isSort = true;
                }
            }
            if (!isSort) {
                break;
            }
        }
        return arr;
    }

    // 快速排序 快速排序方法同時也是遞歸
    function quickSort (arr) {
        if (arr.length <= 1) {
            return arr;
        }
        let x = arr.splice(0, 1)[0];
        let left = [], right = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] < x) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat([x]).concat(quickSort(right));
    }

    // 插入排序
    function spliceSort (arr) {
        let temp;
        for (let i = 1; i < arr.length; i++) {
            for (let j = i; j > 0; j--) {
                if (arr[j] < arr[j - 1]) {
                    temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                } else {
                    break
                }
            }
        }
        return arr;
    }

    // 希爾排序
    function shellSort (arr) {
        let temp;
        let gap = 1;
        while (gap < arr.length) {
            gap = 3 * gap + 1;
        }
        for (; gap > 0; gap = Math.floor(gap / 3)) {
            for (let i = gap; i < arr.length; i ++) {
                for (let j = i; j > 0; j -= gap) {
                    if (arr[j] < arr[j - gap]) {
                        temp = arr[j];
                        arr[j] = arr[j - gap];
                        arr[j - gap] = temp;
                    } else {
                        break
                    }
                }
            }
        }
        return arr;
    }

計算各個方法所花費的時間

  • 最後,須要一個函數調用以上各類排序的方法,並進行時間計算
// 計算排序時間的函數
    function calcTime (arr, fun) {
        console.time(fun.name);
        let newArr = fun(arr);
        console.timeEnd(fun.name);
    }
    
    // 開始計算
    calcTime(arr1,bubleSort);
    calcTime(arr2,quickSort);
    calcTime(arr3,pickSort);
    calcTime(arr4,spliceSort);
    calcTime(arr5,shellSort);

Array.protype.sort是js自帶排序函數,也能夠測試一下速度

// 看下array.prototype中排序的效率如何
    console.time('Array.prototype.sort');
    arr6.sort(function (a,b) {
        return a-b;
    });
    console.timeEnd('Array.prototype.sort');

計算結果來了

bubleSort: 6846.92724609375ms
quickSort: 342.636962890625ms
pickSort: 5732.3818359375ms
spliceSort: 859.482177734375ms
shellSort: 58.785888671875ms
Array.prototype.sort: 69.878173828125msshell

小結

希爾排序 > Array.prototype.sort > 快速排序 > 插入排序 > 選擇排序 > 冒泡排序數組

相關文章
相關標籤/搜索