为了方便理解,先设定个数组,如 let arr = [73, 125, 34, 45, 506, 44, 66, 77, 88, 99];
排序过程中可以对照数组验证。
快速排序的核心思想就是,先取一个基准数,再把比它小的数放它左边,比它大的放右边
通常为了方便起见取第一个数为基准数,那么我们现在的目标就是把这个数放到某个位置,假定这个位置是k,k之前的数字要比它小,之后的数字比它大。
我们要知道冒泡排序是通过相邻两个数字进行比较排序的,这样效率较低。快速排序就是对其进行改进。
而快速排序是分别从两边开始的,先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的数,然后交换它们。为了实现这一功能,我们把我们的老朋友变量i和j请出来,让i的初始位置在最左边(begin),j的初始位置在最右边(end)。
按照规则,j先出发,从右往左找,如果数字大于基准数就继续找下一个(j--),直到碰到比基准数小的数。
j找到数字后,i出发,从左往右找,数字小于基准数就找下一个(i++),直到碰到比基准数大的数。在它们都找到自己的数字时,开始进行交换,实现比基准数小的数去左边,大的去右边。
第一次交换结束后进行循环进行第二次、第三次.....,直到i与j相遇(即i = j),在i = j的位置就是我们要找的基准数放置的位置k,在k左边都比它小,k右边都比它大。
第一轮排序结束,现在我们得到了k的位置,且k左边的数字比它小,右边比它大,那么二轮排序我们在k的左边(begin,k - 1)进行如上操作,k的右边(k + 1,end)也进行如上操作开始循环,直到begin >= end (也就是i >= j)时结束结束循环。
实现代码如下:
function quickSort(arr, begin, end) {
if (begin >= end) return;
let temp = arr[begin];
let i = begin;
let j = end;
while (i < j) {
while (arr[j] >= temp && j > i) {
j--
}
while (arr[i] <= temp && j > i) {
i++
}
if (j > i) {
let t = arr[i]
arr[i] = arr[j]
arr[j] = t
}
}
arr[begin] = arr[i]
arr[i] = temp
quickSort(arr, begin, i - 1)
quickSort(arr, i + 1, end)
}
let arr = [73, 125, 34, 45, 506, 44, 66, 77, 88, 99];
quickSort(arr, 0, 9)
console.log(arr)
快速排序每次进行排序时都会设定一个基准数进行比较排列,每次交换是跳跃式的,总的比较和交换次数少了,速度自然就提高了。当然最坏的情况是,全都是相邻的两个数进行了交换。但快速排序最差的情况效率和冒泡排序相同,一般情况的话效率是比冒泡排序高的。