package main
import (
"fmt"
"math"
)
/**
* 递归三要素
* 1.找到递归终止时机-》切片长度为1时候
* 2.将问题分解成小粒度(需要满足小粒度的解法和原来一样)-》找一个中间值,然后分成左、右两部分 去分别求解
* 3.明白在单个粒度中需要做什么-》先左、右分布求解,然后合并结果
*/
func qs(a []int64) []int64 {
length := len(a)
//尽头条件(停止递归的时机)
if length <= 1 {
return a
}
tmp := a[0]
left := make([]int64, 0)
right := make([]int64, 0)
for i := 1; i < length; i++ {
if tmp < a[i] {
right = append(right, a[i])
} else {
left = append(left, a[i])
}
}
left = qs(left) //得到左边排好序
right = qs(right) //得到右边排好序
return append(append(left, tmp), right...) //左+中+右=最后排好序
}
func main() {
a := []int64{9, 2, 3, 4, 2, 4, 100, 3884, 3313, math.MaxInt64, 3343, math.MinInt64}
fmt.Println("before:", a)
b := qs(a)
fmt.Println("after :", b)
}