递归方法,逻辑简洁清晰。这个算法还是很重要的,需要重点记忆理解,面试经常考,与傅里叶变换等并称“20世纪十大算法”。
快速排序算法的平均时间复杂度是 O(nlogn),最坏情况时间复杂度是 O(n^2)。
package main
import (
"fmt"
)
func main() {
var arr = []int{4, 7, 6, 8, 3, 2, 8, 1}
fmt.Println(arr)
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr)
}
func quickSort(arr []int, startIndex, endIndex int) int {
// 递归结束条件:startIndex大等于endIndex的时候
if startIndex >= endIndex {
return -1
}
// 得到基准元素位置
var pivotIndex = partition(arr, startIndex, endIndex)
// 根据基准元素,分成两部分递归排序(分治法)
quickSort(arr, startIndex, pivotIndex-1)
quickSort(arr, pivotIndex+1, endIndex)
return 0
}
func partition(arr []int, startIndex, endIndex int) int {
// 取第一个位置的元素作为基准元素
var pivot = arr[startIndex]
var left = startIndex
var right = endIndex
for left != right {
//控制right指针比较并左移
for left < right && arr[right] > pivot {
right--
}
//控制right指针比较并右移
for left < right && arr[left] <= pivot {
left++
}
//交换left和right指向的元素
if left < right {
p := arr[left]
arr[left] = arr[right]
arr[right] = p
}
}
//pivot和指针重合点交换
p := arr[left]
arr[left] = arr[startIndex]
arr[startIndex] = p
return left
}
原文:https://www.cnblogs.com/brave-xin/p/9466840.html