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