package main
import (
"math/rand"
"fmt"
)
func Partition(A []int, p, r int) int {
x := A[p]
i := p
for j := p + 1; j <= r; j++ {
if A[j] <= x {
i++
A[i], A[j] = A[j], A[i]
}
}
A[p], A[i] = A[i], A[p]
return i
}
func RandomQuickSort(A []int, p, r int) {
if p < r {
q := RandomPartition(A, p, r)
RandomQuickSort(A, p, q-1)
RandomQuickSort(A, q+1, r)
}
}
func RandomPartition(A []int, p, r int) int {
i := rand.Intn(r - p + 1)
A[p], A[p+i] = A[p+i], A[p]
return Partition(A, p, r)
}
func main() {
//A := []int{3, 6, 9, 9, 8, 4, 2, 1}
A := []int{9, 8, 7, 6, 5, 4, 3, 2}
fmt.Println(A)
RandomQuickSort(A, 0, len(A)-1)
fmt.Println(A)
}