快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。
快速排序的思想
- 在数据集之中,选择一个元素作为"基准"(pivot)。
- 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
- 对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
举例来说
现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50}
- 第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)
- 第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。
- 第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
function quickSort(arr){
if (arr.length <= 1){ return arr; } //如果数组<=1,则直接结束递归
// 定义基准,并把基准从原数组删除
var pivotIndex = Math.floor(arr.length / 2);
var pivot=arr.splice(pivotIndex,1)[0];
// 定义左右数组
var left = [];
var right = [];
// 比基准小的放在left,比基准大的放在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));
}