【算法】快速排序【JS实现】

  作者:zhanhailiang 日期:2012-12-25

在描述快速排序前需要以下划分算法,它是快速排序的基础。

1.划分算法 设A[low…high]是n元数组,且x = A[low]。考虑重新安排数组A中元素,使得小于或等于x的元素排在x的前面,随后x又在所有大于它的元素的前面。经过这样的排列后,经过数组中元素改变排列后,对于某个w,low ⇐ x ⇐ high,A[w] = x,称这样的重排列行为为围绕x的拆分或划分,x称为主元或拆分元素。

接下来我们给出的划分算法split。

/****************************************
算法:split
输入:数组A[low...high]
输出:
    1.若有必要,输出按上述描述的重新排列的数组A;
    2.划分元素A[low]的新位置w;
****************************************/
function split(array, low, high) {
    var i = low;
    var x = array[low];
    for(var j = low + 1; j <= high; j++) {
        if(array[j] <= x) {
            i ++;
            if(i != j) {
                var temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

    temp = array[low];
    array[low] = array[i];
    array[i] = temp;
    return i;
}

整个算法的执行过程中,始终保持两根指针i和j,并在初始时分别置为low和low+1,这两根指针从左向右移动,使得经过每个for循环后有以下结论:

1).A[low] = x;
2).A[k] <= x, 对任意的k, low<=k<=i;
3).A[k] > x, 对任意的k, i<k<=j;

算法对所有元素扫描后,用A[i]与主元交换,这样所有小于或等于主元的元素处在它的左边,并且所有大于主元的元素在它的右边,最后算法将i赋给主元的位置w。由split算法执行的元素的比较次数恰好为n-1,这样它的时间复杂度为O(n);

2.快速排序 快速排序在概括如下,要排序的元素A[low…high]通过算法split重新排列元素,使得原先在A[low]中的主元占据其正确的位置A[w],并且所有小于等于A[w]的元素所外的位置为A[low…w-1],而所有大于A[w]的元素所处的位置是A[w+1…high]递归的排序,产生整个排序数组。

/****************************************
算法:quicksort
输入:A[0...n-1]
输出:按非降序排列数组A[0...n-1]
    quicksort(A, 0, n-1);
****************************************/
function quicksort(array, low, high) {
    if(low < high) {
        var w = split(array, low, high);
        quicksort(array, low, w -1);
        quicksort(array, w +1, high);
        return array;
    }
}

调用示例:

var array = [33, 22, 11, 88, 23, 32];
array = quicksort(array, 0, array.length-1);
console.log(array);

附录:

12.25 今天在http://blogread.cn上看到一篇关于快速排序的JS实现,实现更加简洁,将代码附在下面以供参考:快速排序JS实现优化版本

var quickSort = function(arr) {
  if (arr.length <= 1) { return arr; }
  var pivotIndex = Math.floor(arr.length / 2);
  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));
};

console.log(quickSort([11, 32, 22, 28, 19, 10, 88, 93, 13]));

你可能感兴趣的:(快速排序)