快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。
package test
import (
"fmt"
"testing"
)
func TestFastSort(t *testing.T) {
testArr := []int{2, 5, 3, 7, 4, 5, 8, 1, 4, 0}
testSort(testArr, 0, len(testArr)-1)
fmt.Println(testArr)
}
/**
快速排序:分治法+递归实现
随意取一个值A,将比A大的放在A的右边,比A小的放在A的左边;然后在左边的值AA中再取一个值B,将AA中比B小的值放在B的左边,将比B大的值放在B的右边。以此类推
*/
func quickSort(arr []int, first, last int) {
flag := first
left := first
right := last
if first >= last {
return
}
// 将大于arr[flag]的都放在右边,小于的,都放在左边
for first < last {
// 如果flag从左边开始,那么是必须先从有右边开始比较,也就是先在右边找比flag小的
for first < last {
if arr[last] >= arr[flag] {
last--
continue
}
// 交换数据
arr[last], arr[flag] = arr[flag], arr[last]
flag = last
break
}
for first < last {
if arr[first] <= arr[flag] {
first++
continue
}
arr[first], arr[flag] = arr[flag], arr[first]
flag = first
break
}
}
quickSort(arr, left, flag-1)
quickSort(arr, flag+1, right)
}
版权声明:本文为qq_36520153原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。