1
0
mirror of https://gitlab.com/Anson-Projects/anson-stuff/Go-v-Rust-Quicksort.git synced 2025-06-15 21:56:39 +00:00
2022-04-25 21:02:23 -07:00

118 lines
1.9 KiB
Go

package main
import (
"fmt"
"math/rand"
"time"
)
func quicksort(slice []int) {
if len(slice) <= 1 {
return
}
pivot := partition(slice, choose_pivot(slice))
left := slice[0:pivot]
right := slice[pivot+1:]
quicksort(left)
quicksort(right)
}
func par_quicksort(slice []int) {
if len(slice) <= 1 {
return
}
pivot := partition(slice, choose_pivot(slice))
left := slice[0:pivot]
right := slice[pivot+1:]
go quicksort(left)
go quicksort(right)
}
func partition(slice []int, pivot int) int {
if len(slice) == 1 {
return 0
}
mid := len(slice) - 1
swap(slice, pivot, mid)
left := 0
right := mid - 1
for left < right {
if slice[left] <= slice[mid] {
left = left + 1
} else if slice[right] >= slice[mid] {
right = right - 1
} else {
swap(slice, left, right)
left = left + 1
right = right + 1
}
}
if left > right {
swap(slice, left, mid)
return left
}
if slice[left] >= slice[mid] {
swap(slice, left, mid)
return left
} else if slice[left] <= slice[mid] {
swap(slice, left+1, mid)
return left + 1
}
panic("partition falied.")
}
func choose_pivot(slice []int) int {
left := 0
mid := len(slice) / 2
right := len(slice) - 1
if slice[right] < slice[left] {
left, right = right, left
}
if slice[mid] <= slice[left] {
return left
} else if slice[right] <= slice[mid] {
return right
} else {
return mid
}
}
func swap(slice []int, a int, b int) {
if a <= len(slice) && b <= len(slice) {
slice[a], slice[b] = slice[b], slice[a]
}
}
func main() {
sortSize := 20000000
// MAXGOROUTINES := 1
unsorted := make([]int, 0, sortSize)
start := time.Now()
unsorted = rand.Perm(sortSize)
quicksort(unsorted)
duration := time.Since(start)
fmt.Println("Single Threaded: ", duration)
start = time.Now()
unsorted = rand.Perm(sortSize)
par_quicksort(unsorted)
duration = time.Since(start)
fmt.Println("Concurrent: ", duration)
}