mackxu
子曰:学而时习之,不亦说乎?

     快速排序算法的实现主要采用的是类似于分治的思想的,将一个长的待排序的序列切割成两个,如果还是足够长,就继续切割的。这里的足够长其实只要是多余一个的,都可以切。
所以解决的关键在于怎么进行这个划分,将长的序列切短。这里选择一个切割的标准的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));

};

 

posted on 2013-02-27 20:47  mackxu  阅读(3939)  评论(0编辑  收藏  举报