JS實現快速排序

看了一篇通俗易懂的快排文章 快排,下面一步一步 實現整個過程。windows

快排的基本思想

上面連接的文章對快排的思路提出了一個很形象的概念:挖坑填數 + 分治法,分三個步驟實現:數組

  1. 從數組中取出一個數做爲基準(pivot)。
  2. 在原數組中進行移動,將大於基準的數放到基準右邊,小於基準的數放到基準左邊,在基準左右造成兩個子數組。
  3. 在左右子數組中反覆執行步驟一、2,直到全部子數組只剩下一個數。

詳細步驟

初始數組以下所示,取第一個數爲基準,此時:i = 0, j = 9, pivot = arr[0] = 36,此時 i = 0 的位置就挖了一個坑,等待小於36的數來填這個坑。i 先不變,j-- 從後往前找小於基準的數:ui

clipboard.png


i= 0, j = 8 時,24 < 36,將 arr[8] 挖出,放入 arr[0] 的「坑中」(實際上在寫程序時,是 arr[8] 與 arr[0] 交換)。接着arr[8] 的坑怎麼填?調換順序從前日後找比基準大的數(i++,j 不變):spa

clipboard.png


i= 3, j = 8 時,43 > 36,將 arr[3] 挖出,放入 arr[8] 的「坑中」。接着去找數填 arr[3] 的坑,調換順序從後往前找比基準小的數:.net

clipboard.png


i= 3, j = 5 時,20 > 36,反向查找:3d

clipboard.png


i= j = 5 時,退出,第一趟排序完成,以 arr[5] = 36 爲界分爲左右兩個子數組:code

clipboard.png


接着在左右兩個子數組中重複上面的排序過程,直到每一個子數組的長度爲1,排序結束!下面只給出每一步的執行結果:blog

clipboard.png

clipboard.png


JS代碼

// 快排
function quickSort(arr, i, j) {
  if(i < j) {
    let left = i;
    let right = j;
    let pivot = arr[left];
    while(i < j) {
      while(arr[j] >= pivot && i < j) {  // 從後往前找比基準小的數
        j--;
      }
      if(i < j) {
        arr[i++] = arr[j];
      }
      while(arr[i] <= pivot && i < j) {  // 從前日後找比基準大的數
        i++;
      }
      if(i < j) {
        arr[j--] = arr[i];
      }
    }
    arr[i] = pivot;
    quickSort(arr, left, i-1);
    quickSort(arr, i+1, right);
    return arr;
  }
}

// example
let arr = [2, 10, 4, 1, 0, 9, 5 ,2];
console.log(quickSort(arr, 0 , arr.length-1));

有的書上是以中間的數做爲基準數的,要實現這個方便很是方便,直接將中間的數和第一個數進行交換就能夠了。排序

function quickSort(arr, i, j) {
  if(i < j) {
    let left = i;
    let right = j;
    let mid = Math.floor((left+right)/2);
    let temp = arr[left];
    arr[left] = arr[mid];
    arr[mid] = temp;
    let pivot = arr[left];
    while(i < j) {
      while(arr[j] >= pivot && i < j) {  // 從後往前找比基準小的數
        j--;
      }
      if(i < j) {
        arr[i++] = arr[j];
      }
      while(arr[i] <= pivot && i < j) {  // 從前日後找比基準大的數
        i++;
      }
      if(i < j) {
        arr[j--] = arr[i];
      }
    }
    arr[i] = pivot;
    quickSort(arr, left, i-1);
    quickSort(arr, i+1, right);
    return arr;
  }
}
相關文章
相關標籤/搜索