核心原理
一个基准值,左右分治。默认指定首个元素为基准值,小于基准值放左边,大于基准值放右边;指定左边的元素第一个为基准值,小于基准值放左边,大于基准值放右边;指定右边的元素第一个为基准值,小于基准值放左边,大于基准值放右边;不断递归拆分,直到数组有序。
通俗步骤
- 把数组第一个元素当作基准值;
- 小于基准值放左边,大于基准值放右边;
- 左边数组第一个元素当作基准值;小于基准值放左边,大于基准值放右边;
- 不断递归直到全部有序。
举例演示 [3,1,4,2]
3是基准值,[1,2]放左边,[4]放右边; 递归左子数组:1是基准值,[ ]放左边,[2]放右边; 右子数组长度<=1,返回自身; 逐层拼接 -> [1,2,3,4]
代码示例
package main
import (
"fmt"
)
func quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
pivot := arr[0]
var left, right []int
for _, v := range arr[1:] {
if v < pivot {
left = append(left, v)
} else {
right = append(right, v)
}
}
return append(append(quickSort(left), pivot), quickSort(right)...)
}
func main() {
arr := []int{3, 1, 4, 2}
fmt.Println(arr) // [3,1,4,2]
res := quickSort(arr)
fmt.Println(res) // [1,2,3,4]
}