一、思想
以升序为例,每一趟选择数组(子数组)中某个数作为关键字,将数组中比关键字小的数移至关键字左边,比关键字大的数移至关键字右边。当本次排序完成后,关键字将会移至正确的位置,数组被分为两个更小的子数组,以子数组为初始数组,接着重复以上操作。
二、代码
package main
import "fmt"
func QuickSort(data []int, low int, high int) {
if len(data) < 2 || data == nil{
return
}
i, j := low, high
temp := data[i]
for {
for i < j {
if data[j] <= temp {
data[i] = data[j]
break
}
j--
}
for i < j{
if data[i] > temp{
data[j] = data[i]
break
}
i++
}
if i >= j{
data[i] = temp
break
}
}
if i - 1 > low{
QuickSort(data, low, i - 1)
}
if i + 1 < high{
QuickSort(data, i + 1, high)
}
}
func main() {
arr := []int{
49, 38, 65, 97, 76, 13, 27, 49}
QuickSort(arr, 0, len(arr) - 1)
fmt.Println(arr)
}
[13 27 38 49 49 65 76 97]
Process finished with exit code 0
三、性能分析
数组越有序,效率越低,时间复杂度为:
0 ( n 2 ) 0(n^2) 0(n2)
数组越无序,效率越高,时间复杂度为:
0 ( n log 2 n ) 0(n\log_2 n) 0(nlog2n)
平均时间复杂度为:
0 ( n log 2 n ) 0(n\log_2 n) 0(nlog2n)
空间复杂度为:
0 ( log 2 n ) 0(\log_2 n) 0(log2n)