js排序演算法整理

白木_洋發表於2019-03-01

氣泡排序

思想:

  1. 當前項和後一項進行比較 如果當前項大於後一項則 交換位置

    var arr = [29, 10, 34, 40, 18];
    function bubbleSort(arr) {
        for (var i = 0; i < arr.length - 1; i++){
            for (var j = 0; j < arr.length - 1 - i; j++){
                var num = arr[j];
                if(arr[j] > arr[j + 1]){
                    arr[j] = arr[j + 1];
                    arr[j + 1] = num;
                }
            }
        }
        return arr;
    }
    bubbleSort(arr) // [10, 18, 29, 34, 40]

複製程式碼

插入排序

思想:

  1. 插入排序是從後往前比較, 從第二項開始一次往前比較 如果當前項大於前一項 則停止比較並將當前項插入到前一項的後面
    function insertC(A) {
      for (let i = 1; i < A.length; i++) {
        // p 指向 下一個要比較的索引
        let p = i - 1
    
        // 當前要插入項
        let cur = A[i]
        
        // 只要前一項大於當前項就一直迴圈下去
        while(p >= 0 && A[p] > cur) {
          // 前一項大於當前項 就將前一項往後挪一位
          A[p + 1] = A[p]
          // 每比較完一次 p儲存的索引值 就往前挪一位 進行下次比較
          p--
        }
    
        // 執行到這一行 說明 當前項cur 大於索引p這一項
        // 則將當前項插入到後面
        A[p + 1] = cur
      }
    }
    
    const A5 = [2, 4, 13, 6, 3]
    insertC(A5)
    console.log(A5) // [ 2, 3, 4, 6, 13 ]
複製程式碼

快速排序

思想:

  1. 在待排序的元素任取一個元素作為基準(通常選第一個元素,但最的選擇方法是從待排序元素中隨機選取一個作為基準),稱為基準元素;
  2. 將待排序的元素進行分割槽,比基準元素大的元素放在它的右邊,比其小的放在它的左邊
  3. 對左右兩個分割槽重複以上步驟直到所有元素都是有序的
    var arr = [29, 10, 34, 40, 18];
    function qu(ary) {
        if (ary.length <= 1) return ary;
        var centIndex = Math.floor(ary.length / 2);
        var left = [];
        var right = [];
        var centNum = ary.splice(centIndex, 1)[0];
        for(var i = 0; i< ary.length; i++){
            if(ary[i] < centNum) {
                left.push(ary[i]);
            }else {
                right.push(ary[i]);
            }
        }
        return qu(left).concat(centNum, qu(right));
    }
    console.log(qu(arr));// [10, 18, 29, 34, 40]
複製程式碼

選擇排序

思想:

  1. 拿出用陣列第一項與陣列的第二次開始一次比較,將最小的那一項的索引值[min]儲存,然後再將陣列的第一項索引為[0]與這個最小值兌換位置。(第一次迴圈找出陣列中最小的放在第一位)
  2. 讓後再拿出陣列第二項,與陣列的第三項開始找出陣列中第二小的值的索引[min],然後與陣列中第二項索引為[1]的互換位置。
  3. ......
    var arr = [3, 2, 4, 7, 1, 5, 9, 6, 8];
    var min;
    for (var i = 0; i < arr.length - 2; ++i) {
        var temp = arr[i];
        min = i;
        for (var j = i + 1; j < arr.length - 1; ++j) {
            if (arr[j] < arr[min]) {
                min = j
            }
        }
        arr[i] = arr[min];
        arr[min] = temp;
    }
    console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
複製程式碼

希爾排序

希爾排序: 他是首先比較最遠的元素而非相鄰的元素,讓元素儘快回到正確的位置通過定義一個間隔序列來表示在排序過程中進行比較的元素間隔。公開的間隔序列為 701, 301, 132, 57, 23, 10, 4, 1

var arr = [3, 2, 4, 7, 1, 5, 9, 6, 8];
var gops = [5, 3, 1];
for(var g=0; g<gops.length;g++) {
    for(var i=gops[g]; i<arr.length; i++){
        var temp=arr[i];
        for(var j=i; j>=gops[g] && arr[j-gops[g]]>temp;j-=gops[g]){
            arr[j] = arr[j-gops[g]];
        }
        arr[j] = temp
    }
}
console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
複製程式碼

相關文章