golang 快速排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 快速排序相关的知识,希望对你有一定的参考价值。
func partition(A []int, p, r int) int {
x, i := A[r-1], p
for j := p; j < r-1; j++ {
if A[j] <= x {
A[i], A[j] = A[j], A[i]
i++
}
}
A[i], A[r-1] = A[r-1], A[i]
return i
}
// QuickSort O(nlgn)
func QuickSort(A []int, p, r int) {
if p+1 < r {
q := partition(A, p, r)
QuickSort(A, p, q)
QuickSort(A, q+1, r)
}
}
import "math/rand"
func partition(A []int, p, r int) int {
x, i := A[r-1], p
for j := p; j < r-1; j++ {
if A[j] <= x {
A[i], A[j] = A[j], A[i]
i++
}
}
A[i], A[r-1] = A[r-1], A[i]
return i
}
func randPartition(A []int, p, r int) int {
i := rand.Intn(r-p) + p
A[i], A[r-1] = A[r-1], A[i]
return partition(A, p, r)
}
// RandQuickSort O(nlgn)
func RandQuickSort(A []int, p, r int) {
if p+1 < r {
q := randPartition(A, p, r)
RandQuickSort(A, p, q)
RandQuickSort(A, q+1, r)
}
}
import "math/rand"
func partition(A []int, p, r int) int {
x, i := A[r-1], p
for j := p; j < r-1; j++ {
if A[j] <= x {
A[i], A[j] = A[j], A[i]
i++
}
}
A[i], A[r-1] = A[r-1], A[i]
return i
}
func randPartition(A []int, p, r int) int {
i := rand.Intn(r-p) + p
A[i], A[r-1] = A[r-1], A[i]
return partition(A, p, r)
}
// RandQuickSortGo O(nlgn)
func RandQuickSortGo(A []int, p, r int, chans chan<- int) {
if p+1 < r {
q := randPartition(A, p, r)
if r-p > 1000 {
c := make(chan int, 2)
go RandQuickSortGo(A, p, q, c)
go RandQuickSortGo(A, q+1, r, c)
for i := 0; i < 2; i++ {
<-c
}
} else {
RandQuickSortGo(A, p, q, nil)
RandQuickSortGo(A, q+1, r, nil)
}
}
if chans != nil {
chans <- 0
}
}
import "math/rand"
func partitionSameElement(A []int, p, r int) (int, int) {
x, i, j := A[r-1], p, r
for k := p; k < j; k++ {
if A[k] <= x {
A[i], A[k] = A[k], A[i]
if A[i] != x {
i++
}
} else if A[k] > x {
j--
A[j], A[k] = A[k], A[j]
}
}
return i, j
}
func randPartitionSameElement(A []int, p, r int) (int, int) {
i := rand.Intn(r-p) + p
A[i], A[r-1] = A[r-1], A[i]
return partitionSameElement(A, p, r)
}
// RandQuickSortSameElement O(nlgn)
func RandQuickSortSameElement(A []int, p, r int) {
if p+1 < r {
q, t := randPartitionSameElement(A, p, r)
RandQuickSortSameElement(A, p, q)
RandQuickSortSameElement(A, t, r)
}
}
import "math/rand"
func partitionSameElement(A []int, p, r int) (int, int) {
x, i, j := A[r-1], p, r
for k := p; k < j; k++ {
if A[k] <= x {
A[i], A[k] = A[k], A[i]
if A[i] != x {
i++
}
} else if A[k] > x {
j--
A[j], A[k] = A[k], A[j]
}
}
return i, j
}
func randPartitionSameElement(A []int, p, r int) (int, int) {
i := rand.Intn(r-p) + p
A[i], A[r-1] = A[r-1], A[i]
return partitionSameElement(A, p, r)
}
// TailRescursiveQuickSort O(nlgn)
func TailRescursiveQuickSort(A []int, p, r int) {
for p+1 < r {
q, t := randPartitionSameElement(A, p, r)
TailRescursiveQuickSort(A, p, q)
p = t
}
}
用golang刷算法--快速排序算法
快速排序算法流程
- 选定一个基准值(任意选,以第一个为例)
- 定义左右指针指向左右两端
- 左指针往右移动,如果遇到大于基准值的数就把它和右指针的值调换位置,然后左指针不动,右指针开始向左移动,如果遇到小于基准值的数就把他和左指针的值调换位置,然后开始移动左指针,以此类推,知道左右指针相遇
- 递归上述过程知道排序结束
用golang实现
func QuickSort(intList []int) {
// 如果长度小于等于1就直接结束
if len(intList) <= 1 {
return
}
// 1. 将第一个值选定为基准值
flag := intList[0]
// 定义左右指针
left, right := 0, len(intList)-1
for i := 1; i <= right; {
if intList[i] > flag {
intList[i], intList[right] = intList[right], intList[i]
right--
}else{
intList[i], intList[left] = intList[left], intList[i]
i++
left++
}
}
// 递归
QuickSort(intList[:left])
QuickSort(intList[left+1:])
}
以上是关于golang 快速排序的主要内容,如果未能解决你的问题,请参考以下文章
手撸golang 基本数据结构与算法 快速排序
golang 快速排序
[golang] 数据结构-快速排序
用golang刷算法--快速排序算法
golang数据结构之快速排序
golang的并行快速排序