package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
// func partition(arr []int, start, end int) (p int) {
// if start >= end {
// return
// }
//
// i, j, pivot := start, end, arr[start]
// for i < j {
// // 自右向左找一个小于等于基准的元素
// for i < j && arr[j] > pivot {
// j--
// }
//
// // 自左向右找一个大于基准的元素
// for i < j && arr[i] <= pivot {
// i++
// }
//
// if i < j {
// // 交换位置
// arr[i], arr[j] = arr[j], arr[i]
// }
// }
//
// // 更新基准
// arr[i], arr[start] = arr[start], arr[i]
//
// return i
//
// }
func partition(a []int, left, right int) int {
pivot := a[right]
i := left
for j := left; j < right; j++ {
// 如果比基准小就换到前面
if pivot > a[j] {
// fmt.Println(i, j)
a[j], a[i] = a[i], a[j]
// i 记录换过的位置,i 之前都比基准小
i++
}
}
// 更新基准
a[i], a[right] = a[right], a[i]
return i
}
func quickSort(a []int, lo, hi int) {
if lo >= hi {
return
}
p := partition(a, lo, hi)
quickSort(a, lo, p-1)
quickSort(a, p+1, hi)
}
func quickSort_go(a []int, lo, hi int, done chan struct{}, depth int) {
if lo >= hi {
done <- struct{}{}
return
}
depth--
p := partition(a, lo, hi)
if depth > 0 {
childDone := make(chan struct{}, 2)
go quickSort_go(a, lo, p-1, childDone, depth)
go quickSort_go(a, p+1, hi, childDone, depth)
<-childDone
<-childDone
} else {
quickSort(a, lo, p-1)
quickSort(a, p+1, hi)
}
done <- struct{}{}
}
func main() {
rand.Seed(time.Now().UnixNano())
testData1, testData2, testData3 := make([]int, 0, 100000000), make([]int, 0, 100000000), make([]int, 0, 100000000)
times := 100000000
for i := 0; i < times; i++ {
val := rand.Intn(20000000)
testData1 = append(testData1, val)
testData2 = append(testData2, val)
testData3 = append(testData3, val)
}
start := time.Now()
quickSort(testData1, 0, len(testData1)-1)
fmt.Println("single goroutine: ", time.Now().Sub(start))
if !sort.IntsAreSorted(testData1) {
fmt.Println("wrong quick_sort implementation")
}
done := make(chan struct{})
start = time.Now()
go quickSort_go(testData2, 0, len(testData2)-1, done, 5)
<-done
fmt.Println("multiple goroutine: ", time.Now().Sub(start))
if !sort.IntsAreSorted(testData2) {
fmt.Println("wrong quickSort_go implementation")
}
start = time.Now()
sort.Ints(testData3)
fmt.Println("std lib: ", time.Now().Sub(start))
if !sort.IntsAreSorted(testData3) {
fmt.Println("wrong std lib implementation")
}
}[1]: https://colobu.com/2018/06/26/implement-quick-sort-in-golang/
本文标题:golang 实现的快速排序
版权声明:本文使用「署名 4.0 国际」创作共享协议,转载或使用请遵守署名协议。