javascript实现快速排序算法

忘记了快速排序的思路是怎样的了,复习一下,写了两个实例,发表博文备忘。

对于快速排序的思想,可以参考白话经典算法系列之六 快速排序 快速搞定,讲得比较通俗

prototype扩展的方式

/**
 * 对Array对象的原型扩展来实现快速排序
 * @param [left]  排序开始位置
 * @param [right]  排序结束位置
 * @returns {Array}
 */
Array.prototype.quickSort = function(left, right){
    if(left === undefined)   left = 0;      //若left和right为空,设置初始值
    if(right === undefined)   right = this.length - 1;
    if(left < right){
        var ref = this[left];
        var low = left;
        var high = right;
        while(low < high){
            //从右往左查询比ref小的值
            while(low < high && this[high] > ref){
                --high;
            }
            this[low] = this[high];
            //从左往右查询比ref大的值
            while(low < high && this[low] < ref){
                ++low
            }
            this[high] = this[low];
        }
        this[low] = ref;
        this.quickSort(low+1, right);
        this.quickSort(left, low-1);
    }
    return this;
};

var arr1 = [95,8,65,98,54,25,3,654,4,74,63,88,35,68];
console.log(arr1.quickSort());

非prototype方式

/**
 * @param array //要排序的数组
 * @returns {Array} //排完序的数组
 */
var quicksort = function(array){
    if(!array.length)   return array;
    var low = 0;
    var high = array.length - 1;
    var ref = array[low];
    while(low < high){
        while(low < high && array[high] > ref){
            --high;
        }
        array[low] = array[high];
        while(low < high && array[low] < ref){
            ++low
        }
        array[high] = array[low];
    }
    array[low] = ref;
    return quicksort(array.slice(0,low)).concat([ref],quicksort(array.slice(low+1, array.length)));
};

var arr2 = [95,8,65,98,54,25,3,654,4,74,63,88,35,68];
console.log(quicksort(arr2));