Skip to content
← 返回算法列表
问题与数据结构

快速排序 ​

排序

说明 ​

按基准值分区并递归处理;平均 O(n log n),最坏 O(n²)。

分析 ​

选择一个基准值,用双指针把较小值移到左侧、较大值移到右侧,再分别递归。分区均衡时性能很好;若基准长期偏向一侧,递归深度和时间会恶化。

图解推演

正文 [3,1,2] 选中间值 1 为基准,左右扫描后交换 3 与 1,得到 [1,3,2],再递归后缀并得到 [1,2,3]。相等值交换后也要推进两个游标,否则重复元素可能使循环停滞。分区完成只保证两侧符合基准约束,并不意味着每一侧已经有序。

查看图表代码

适用前提与边界 ​

工程实现通常加入随机化或深度限制。

示例输入与调用 ​

go
a := []int{3, 1, 2}
	QuickSort(a)
	fmt.Println(a)

运行输出 ​

text
[1 2 3]

完整 Go 示例 ​

go
package main

import "fmt"

func QuickSort(a []int) {
	if len(a) < 2 {
		return
	}
	pivot := a[len(a)/2]
	i, j := 0, len(a)-1
	for i <= j {
		for a[i] < pivot {
			i++
		}
		for a[j] > pivot {
			j--
		}
		if i <= j {
			a[i], a[j] = a[j], a[i]
			i++
			j--
		}
	}
	if j >= 0 {
		QuickSort(a[:j+1])
	}
	if i < len(a) {
		QuickSort(a[i:])
	}
}

func main() {
	a := []int{3, 1, 2}
	QuickSort(a)
	fmt.Println(a)
}

继续阅读