1. 什么快速排序
快速排序是冒泡排序的升级版,排序本质是循环,快速循环,指的就是循环很快,那这个快速排序自然就是减少循环次数来提升更快的循环了。
2. 快速排序思想
快速排序主要的核心思想就是:选基点、后排序、再分治
最后递归重复
2.1 选基点
arr = [10, 2, 9, 12, 8, 20, 30, 4]
在 arr 数组中选择任意一个数字作为左右两边比较的基点,比如我们选择 10
2.2 后排序
将小于10的放左边、大于10的放右边
arr = [2, 9, 8, 4, 10, 20, 30, 12]
2.3 再分治
分割 [2, 9, 8, 4] 和 [20, 30, 12] 出来,然后重复 2.1 和 2.2 步骤
3. 代码案例分析
function swap(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
function QuickSort(arr, low, high) {
if (low >= high) return
// 1. 选基点
let i = low, j = high, pivot = arr[low]
while(i < j) {
// 2. 排序
while (arr[j] >= pivot && i < j ) {
// 右边大于基点的忽略掉,向前走
j --
}
while (arr[i] <= pivot && i < j ) {
// 左边小于基点的忽略掉,向前走
i ++
}
swap(arr, i, j) // 最后肯定发生右边小于基点,左边大于基点,此时进行交换位置即可
}
swap(arr, low, j) // 排序后别完了还要把基准点的值放到左右两边中间,这里的 j 也可以换成 i
// 3. 分割左右两边,然后重复以上步骤
QuickSort(arr, low, j - 1)
QuickSort(arr, j + 1, high)
return arr
}
let arr = [10, 2, 9, 12, 8, 20, 30, 4]
QuickSort(arr, 0, arr.length - 1)
// 排序后
// arr: [2, 4, 8, 9, 10, 12, 20, 30]
完!