快速排序算法的實現主要采用的是類似於分治的思想的,將一個長的待排序的序列切割成兩個,如果還是足夠長,就繼續切割的。這里的足夠長其實只要是多余一個的,都可以切。
所以解決的關鍵在於怎么進行這個划分,將長的序列切短。這里選擇一個切割的標准的S,將S放在中間,小於S的放在左邊,大於S的放在右邊。於是繼續可以用遞歸來完成實現。
在一個快速排序普遍的版本中,使用的是序列的最后一個元素來作為標准S的。下面實現了一個較為簡單的快速排序:
//JS實現快速排序(從小到大排列) if(typeof Array.prototype.quickSort !== 'function') { Array.prototype.quickSort = function() { quickSortHelper(this, 0, this.length-1); //確定哨兵, 遞歸分離 function quickSortHelper(arr, start, end) { if(start < end){ //快排結束條件start>=end //獲取哨兵的位置 var part = partation(arr, start, end); //根據遞歸實現排序 arguments.callee(arr, start, part-1); arguments.callee(arr, part+1, end); } } function partation(arr, start, end) { var pivot = arr[end]; //設置哨兵 var i = start; //交換的次數+1 哨兵要在數組插入的位置 for(var j=start; j<end; j++) { if(arr[j] < pivot) { swap(arr, i, j); i++; } } swap(arr, i, end); return i; } //交換數組元素的值 function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } //------------------- test ------ var arr = [5, 2, 3, 1, 4]; arr.quickSort(); console.log(arr);
更新2013-08-04
快速排序的思想很簡單,整個排序過程只需要三步:
- 在數據集中,選擇一個元素作為“基准”(pivot)
- 所有小於“基准”的元素,都移到“基准”的左邊,所有大於“基准”的元素,都移到右邊。
- 對“基准”左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。
實現代碼如下:
var quickSort = function(arr) { if(arr.length <= 1) return arr; // 遞歸停止條件 // 選取基准值 var pivotIndex = Math.ceil(arr.length / 2); var pivot = arr.splice(pivotIndex, 1)[0]; // 基准值 var left = [], right = []; // 如果大於基准值,移到數組right中;小於基准的值,移到數組left中 for(var i=0; i< arr.length; i++) { arr[i] > pivot ? right.push(arr[i]) : left.push(arr[i]); } return quickSort(left).concat([pivot], quickSort(right)); };