summaryrefslogtreecommitdiff
path: root/sort/quick.go
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2020-08-08 14:32:37 +0100
committerPaul Buetow <pbuetow@mimecast.com>2020-08-08 14:32:37 +0100
commitc870dae11a5ec088800a35665d6ac1baa3abef3a (patch)
tree901714ce898921077efd0e4f903175a390b6cebf /sort/quick.go
parent0db964a3b8ba57b3677d9d201870ee5ab15b6a30 (diff)
refactor quicksort
Diffstat (limited to 'sort/quick.go')
-rw-r--r--sort/quick.go35
1 files changed, 14 insertions, 21 deletions
diff --git a/sort/quick.go b/sort/quick.go
index 5dbcfe5..72db370 100644
--- a/sort/quick.go
+++ b/sort/quick.go
@@ -6,41 +6,34 @@ import (
func Quick(a ds.ArrayList) ds.ArrayList {
Shuffle(a)
- quick(a, 0, len(a)-1)
+ quick(a)
return a
}
-func quick(a ds.ArrayList, lo, hi int) {
- if hi <= lo+10 {
- insertion(a, lo, hi)
+func quick(a ds.ArrayList) {
+ if len(a) <= 10 {
+ Insertion(a)
return
}
- j := quickPartition(a, lo, hi)
-
- quick(a, lo, j-1)
- quick(a, j+1, hi)
+ j := quickPartition(a)
+ quick(a[0:j])
+ quick(a[j+1:])
}
-func quickPartition(a ds.ArrayList, lo, hi int) int {
- i := lo // Left scan index
- j := hi + 1 // Right scan index
+func quickPartition(a ds.ArrayList) int {
+ i := 0 // Left scan index
+ j := len(a) // Right scan index
- insertion(a, lo, lo+2)
- a.Swap(lo, lo+1)
- v := a[lo] // Partitioning item
+ Insertion(a[0:3])
+ a.Swap(0, 1)
+ v := a[0] // Partitioning item
for {
for i++; a[i] < v; i++ {
- if i == hi {
- break
- }
}
for j--; v < a[j]; j-- {
- if j == lo {
- break
- }
}
// Check scan complete
@@ -52,7 +45,7 @@ func quickPartition(a ds.ArrayList, lo, hi int) int {
}
// Put partitioning item v into a[j]
- a.Swap(lo, j)
+ a.Swap(0, j)
// whith a[lo..j-1 <= a[j] <= a[j+1..hi]
return j