go 实现快速排序算法

404 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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]

二叉树

1653740250(1).png

不会用掘金的富文本编辑器画二叉树。只能手画了

对勾表示分界值。然后使用中序遍历法,就排序成功了。