Go---快速排序算法

129 阅读2分钟

快速排序算法

快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要O(n log n)(大O符号)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。

以上是wiki对快速排序算法的简单解释。

基本思想

从实现角度出发, 其实就是先选出一串数字中的一个数作为基准值(pivot),然后将小于(或小于等于)pivot的数放到左边的数组中,将大于(或大于等于)pivot的值放入右边的数组中,如下图所示

image.png

这里将 5 作为这串数字的基准值,由于0,1,2,3都小于5,所以将他们放在左边的数组中,6,7,9大于5,所以将他们放到右边,如果有多个5,则放到左右都可以。

将一个数组分成如下三部分后,再如法炮制,对左边和右边两个数组分别进行快排,直到数组长度小于等于1,数组不能再分割成再小的数组,最后将所有的数组和基准值有序的拼接起来,就是一个有序的数组,实现了对数组的快速排序。 如下图

image.png

Go代码实现

为了方便,使用切片代替数组

package main

import (
   "fmt"
)

func main() {
   s := []int{8, 4, 5, 7, 1, 1, 3, 6, 35, 23, 654, 43567, 5744, 234523,
      5445, 52432, 745345, 45, 435, 35234, 3242532, 234223, 2345, 223425,
      2234235, 23534, 233346, 545}
   // 调用快速排序方法并输出排序结果
   fmt.Println(QuickSort(s))
}

// QuickSort 快速排序
func QuickSort(s []int) []int {
   if len(s) <= 1 {
      return s
   }
   // 基准值
   pivot := s[0]
   // 小于和大于基准值的两个切片
   left := make([]int, 0)
   right := make([]int, 0)
   // 如果小于基准值,就放到left切片中,反之放到right切片中
   for i := 1; i < len(s); i++ {
      if s[i] >= pivot {
         right = append(right, s[i])
      } else {
         left = append(left, s[i])
      }
   }
   // 递归快速排序并将合并结果返回
   return append(append(QuickSort(left), pivot), QuickSort(right)...)
}