JavaScript實現標準快速排序

Mr.甘發表於2018-10-31

快速排序是分治策略的經典實現,分治的策略如下:

  1. 分解(Divide)步驟:將問題劃分未一些子問題,子問題的形式與原問題一樣,只是規模更小

  2. 解決(Conquer)步驟:遞迴地求解出子問題。如果子問題的規模足夠小,則停止遞迴,直接求解

  3. 合併(Combine)步驟:將子問題的解組合成原問題的解

    快速排序函式,我們需要將排序問題劃分為一些子問題進行排序,然後通過遞迴求解,我們的終止條件就是,當array.length > 1不再生效時返回陣列

    function quickSort(array) {
        return quick(array, 0, array.length - 1);
    };
    function quick(array, left, right) {
        let index;
        if (array.length > 1) {
          index = partition(array, left, right);
          if (left < index - 1) {
            quick(array, left, index - 1);
          }
          if (index < right) {
            quick(array, index, right);
          }
        }
        return array;
    }
    // 劃分操作函式
    function partition(array, left, right) {
        // 利用index取中間值可以大大降低演算法的時間複雜度
        const pivot = array[Math.floor((right + left) / 2)];
        let i = left;
        let j = right;
        while (i <= j) {
          while (compare(array[i], pivot) === -1) {
            i++;
          }
          while (compare(array[j], pivot) === 1) {
            j--;
          }
          if (i <= j) {
            swap(array, i, j);
            i++;
            j--;
          }
        }
        return i;
    }
    // 比較函式
    function compare(a, b) {
        if (a === b) {
          return 0;
        }
        return a < b ? -1 : 1;
    }
    

相關文章