快速排序算法
快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要O(n log n)(大O符号)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。
以上是wiki对快速排序算法的简单解释。
基本思想
从实现角度出发, 其实就是先选出一串数字中的一个数作为基准值(pivot),然后将小于(或小于等于)pivot的数放到左边的数组中,将大于(或大于等于)pivot的值放入右边的数组中,如下图所示
这里将 5 作为这串数字的基准值,由于0,1,2,3都小于5,所以将他们放在左边的数组中,6,7,9大于5,所以将他们放到右边,如果有多个5,则放到左右都可以。
将一个数组分成如下三部分后,再如法炮制,对左边和右边两个数组分别进行快排,直到数组长度小于等于1,数组不能再分割成再小的数组,最后将所有的数组和基准值有序的拼接起来,就是一个有序的数组,实现了对数组的快速排序。 如下图
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)...)
}