白话快速排序

0 阅读1分钟

核心原理

一个基准值,左右分治。默认指定首个元素为基准值,小于基准值放左边,大于基准值放右边;指定左边的元素第一个为基准值,小于基准值放左边,大于基准值放右边;指定右边的元素第一个为基准值,小于基准值放左边,大于基准值放右边;不断递归拆分,直到数组有序。

通俗步骤

  1. 把数组第一个元素当作基准值;
  2. 小于基准值放左边,大于基准值放右边;
  3. 左边数组第一个元素当作基准值;小于基准值放左边,大于基准值放右边;
  4. 不断递归直到全部有序。

举例演示 [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]
}