目前,最常見的排序演算法大概有七八種,其中"快速排序"(Quicksort)使用得最廣泛,速度也較快。它是圖靈獎得主 東尼·霍爾(C. A. R. Hoare)於1960時提出來的。 快速排序"的思想很簡單,整個排序過程只需要三步: (1)在數據集之中,選擇一個元素作為"基準"(pivot)。 (2) ...
目前,最常見的排序演算法大概有七八種,其中"快速排序"(Quicksort)使用得最廣泛,速度也較快。它是圖靈獎得主 東尼·霍爾(C. A. R. Hoare)於1960時提出來的。 快速排序"的思想很簡單,整個排序過程只需要三步: (1)在數據集之中,選擇一個元素作為"基準"(pivot)。 (2)所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。 (3)對"基準"左邊和右邊的兩個子集,不斷重覆第一步和第二步,直到所有子集只剩下一個元素為止。 舉例來說,現在有一個數據集{85, 24, 63, 45, 17, 31, 96, 50},怎麼對其排序呢? 第一步,選擇中間的元素45作為"基準"。(基準值可以任意選擇,但是選擇中間的值比較容易理解。) 第二步,按照順序,將每個元素與"基準"進行比較,形成兩個子集,一個"小於45",另一個"大於等於45"。 第三步,對兩個子集不斷重覆第一步和第二步,直到所有子集只剩下一個元素為止。 按照之前的步驟,定義一個quickSort函數: var quickSort = function(arr) { //參數是一個數組 if (arr.length <= 1) { return arr; } //檢查數組的元素個數,如果小於等於1,就返回。 var pivotIndex = Math.floor(arr.length / 2); //選擇"基準"(pivot),並將其與原數組分離,再定義兩個空數組,用來存放一左一右的兩個子集。 var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var right = []; for (var i = 0; i < arr.length; i++){ //開始遍曆數組,小於"基準"的元素放入左邊的子集,大於基準的元素放入右邊的子集。 if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); }; 演算法思路:
- 從數列中挑出一個元素,稱為 “基準”(pivot);
- 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出 之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作;
- 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序;