持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
快速排序算法
使用二分法,实现递归完成快速排序。
1、先设定一个分界值
2、让每一个数和它比较,比它大的放右边,比它小的放左边
3、左边的值又可以取一个分界值,重复第二步
4、左边的值排好序后,就可以排右边的值,重复第二步。
代码示例:
package main
import "fmt"
func QuickSort(arr []int) []int {
//如果数组中只有一个值,则返回arr
if len(arr) <= 1 {
return arr
}
splitData := arr[0] //设定第一个为分界值
leftNum := make([]int, 0, 0) //比第一个分界值小的数,放在左边数组
rightNum := make([]int, 0, 0) //比第一个分界值大的数,放在右边数组
mid := make([]int, 0, 0) //和第一个数一样大的放在这个数组
mid = append(mid, splitData) //加入进去
//for循环遍历数组
for i := 1; i < len(arr); i++ {
//如果比分界值小
if arr[i] < splitData {
leftNum = append(leftNum, arr[i])
//如果比分界值大
} else if arr[i] > splitData {
rightNum = append(rightNum, arr[i])
} else {
mid = append(mid, arr[i])
}
}
//递归这个函数,(二叉树的感觉)
leftNum, rightNum = QuickSort(leftNum), QuickSort(rightNum)
//数组合并
sortArr := append(append(leftNum, mid...), rightNum...)
//返回
return sortArr
}
//快读排序算法
func main() {
//定义一个数组
arr := []int{34,99,22,77,1,2,7,7,9,25,32}
//打印数组
fmt.Println(QuickSort(arr))
}
结果:
[1 2 7 7 9 22 25 32 34 77 99]
顺一遍逻辑
比如有 44 、12、5、13,55四个数
1、我们选取第一个数(44)为分界值,遍历一下
2、左边的数组[12,5,13],右边数组 [55]
3、左边数组选取12为分界值 左边[5],右边[13]
4、因为只有一个数了,所以返回数组
5、拼接 [左边,中间、右边],[5,12,13,44]
6、右边数组只有一个数,返回
7、拼接[5,12,13,44]
二叉树
不会用掘金的富文本编辑器画二叉树。只能手画了
对勾表示分界值。然后使用中序遍历法,就排序成功了。