js實現數組排序

js對數組進行排序的方法還是很多的,最近剛好又有一個實現表格排序功能的需求,本來是讓後臺做的,但由於各種因素推到了前端。嗯,正好回顧一下數組排序的多種實現方式~

1. JavaScript的sort()方法

sort()方法按照升序排列數組項,會調用每個數組項的toString()轉型方法,然後比較得到的字符串。

compare()函數方法是一個比較函數,作爲sort()方法的參數。

function compare(val1,val2){
    return val1-val2;
};
array.sort(compare);

這種方法就不必多說了,簡單粗暴,不用寫排序的算法邏輯。

2. 冒泡排序

  • (1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個位置。
  • (2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  • (3)針對所有的元素重複以上的步驟,除了最後一個。
  • (4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {        //相鄰元素兩兩對比
                var temp = arr[j+1];        //元素交換
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

最簡單的排序算法,但如果有追求的話還是不要使用了,因爲有其他更好的實現方式。

3. 快速排序

遞歸思想,兩邊快速的排序,冒泡排序的改進

function quickSort(arr){
//如果數組長度小於等於1,則返回數組本身
    if(arr.length<=1){
        return arr;
    }
    //定義中間值的索引
    var index = Math.floor(arr.length/2);
    //取到中間值
    var temp = arr.splice(index,1);
    //定義左右部分數組
    var left = [];
    var right = [];
    for(var i=0;i<arr.length;i++){
    //如果元素比中間值小,那麼放在左邊,否則放右邊
        if(arr[i]<temp){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat(temp,quickSort(right));
}

快速排序總結起來就是快,效率高,是處理大數據最快的排序算法之一。快速排序的內循環比大多數排序算法都要短小,這意味着它無論是在理論上還是在實際中都要更快。它的主要缺點是非常脆弱,在實現時要非常小心才能避免低劣的性能。

4.插入排序

function insertSort(arr){
//假設第0元素是有序序列,第1元素之後是無序的序列。從第1元素開始依次將無序序列的元素插入到有序序列中
    for(var i=1; i<arr.length;i++){
        if(arr[i]<arr[i-1]){
            //取出無序序列中需要插入的第i個元素
            var temp = arr[i];
            //定義有序中的最後一個位置
            var j = i-1;
            arr[i] = arr[j];
            //比較大小,找到插入的位置
            while(j>=0&&temp<arr[j]){
                arr[j+1] = arr[j];
                j--;
            };
            //插入
            arr[j+1] = temp;
        }
    }
    return arr;
  }

插入排序算是原理最容易理解的排序方式。

5. 選擇排序

  • (1)在未排序序列中找到最小(大)元素
  • (2)並存放到排序序列的起始位置
  • (3)然後,再從剩餘未排序元素中繼續尋找最小(大)元素
  • (4)然後放到已排序序列的末尾。
  • (5)以此類推

function selectSort(arr){
    for(var i=0;i<arr.length;i++){
        //設置當前範圍最小值和索引
        var min = arr[i];
        var minIndex = i;
        //在該範圍選出最小值
        for(var j=i+1;j<arr.length;j++){
            if(min>arr[j]){
                min = arr[j];
                minIndex = j;
            }
        }
        //將最小值插入,並將原來位置的最小值刪除
        arr.splice(i,0,min);
        arr.splice(minIndex+1,1);
    }
    return arr;
}

在時間複雜度上表現最穩定的排序算法之一,用到它的時候,數據規模越小越好。

當然還有很多其他的算法,比如希爾排序、歸併排序、堆排序等,有興趣的可以自行研究~我這裏也只是記錄一下大家總結的常用的幾種方式,排序具體用什麼方式還是根據實際情況來定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章