排序算法:快速排序
交换排序
1. 简介
快速排序是对冒泡算法的一种改进。
基本原理:
以第1个元素数据为枢轴,第1个元素索引为低位索引,最后1个元素索引为高位索引, 高位从后向前遍历并判断大小。
如果低位元素小于高位元素不操作高位继续向前遍历,否则将高位的数据保存到低位上并将低位索引向后移1位,低位从前向后遍历并判断大小。
如果低位元素小于高位元素不操作低位继续向后遍历,否则将低位的数据保存到高位上并将高位索引向前移1们,重新开始高位从后向前遍历判断大小。
一直重复下去直到低位索引不小于高位索引,将枢轴数据保存到低位索引上,然后将当前数据以枢轴元素的位置为中心分成两部份。并将两部份分别在执行上面步骤,一直重复直到每个部份元素为1个时。
2. 图示
3. 演示
3.1. 文件树形图
quicksort
├── go.mod
├── quicksort.go
└── quicksort_test.go
3.2. 代码
quicksort.go
package quicksort
func QuickSort(array []int) {
qSort(array, 0, len(array)-1)
}
func qSort(array []int, low, high int) {
if low < high {
pivot := partition(array, low, high)
qSort(array, low, pivot-1)
qSort(array, pivot+1, high)
}
}
// 返回枢轴索引
func partition(array []int, low, high int) int {
pivot := array[low]
t := array[low]
for low < high {
// 从后向前扫描
for low < high && array[high] >= pivot {
high--
}
// 如果low<high停止代表碰到,array[high] < pivot的数字
if low < high {
array[low] = array[high]
low++
}
// 从前向后扫描
for low < high && array[low] <= pivot {
low++
}
// 如果low<high停止代表碰到,array[low] > pivot的数字
if low < high {
array[high] = array[low]
high--
}
array[low] = t
}
return low
}
quicksort_test.go
package quicksort
import (
"testing"
)
func TestQuickSort(t *testing.T) {
arr := []int{55, 22, 44, 67, 35, 77, 18, 69}
QuickSort(arr)
t.Log(arr)
}
3.3. 测试
=== RUN TestQuickSort
TestQuickSort: quicksort_test.go:10: [18 22 35 44 55 67 69 77]
--- PASS: TestQuickSort (0.00s)
PASS
4. 参考
- 《C/C++函数与算法速查手册》