JS實現快排算法


     快速排序算法的實現主要采用的是類似於分治的思想的,將一個長的待排序的序列切割成兩個,如果還是足夠長,就繼續切割的。這里的足夠長其實只要是多余一個的,都可以切。
所以解決的關鍵在於怎么進行這個划分,將長的序列切短。這里選擇一個切割的標准的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

快速排序的思想很簡單,整個排序過程只需要三步:

  1. 在數據集中,選擇一個元素作為“基准”(pivot)
  2. 所有小於“基准”的元素,都移到“基准”的左邊,所有大於“基准”的元素,都移到右邊。
  3. 對“基准”左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。

實現代碼如下:

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));

};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM