summaryrefslogtreecommitdiff
path: root/sort/quick.go
diff options
context:
space:
mode:
Diffstat (limited to 'sort/quick.go')
-rw-r--r--sort/quick.go95
1 files changed, 44 insertions, 51 deletions
diff --git a/sort/quick.go b/sort/quick.go
index dde71f9..f58f046 100644
--- a/sort/quick.go
+++ b/sort/quick.go
@@ -5,62 +5,55 @@ import (
)
func Quick(a ds.ArrayList) ds.ArrayList {
- a = Shuffle(a)
- quick(a, 0, len(a)-1)
- return a
+ Shuffle(a)
+ quick(a, 0, len(a)-1)
+ return a
}
func quick(a ds.ArrayList, lo, hi int) {
- if hi <= lo {
- return
- }
+ if hi <= lo+10 {
+ insertion(a, lo, hi)
+ return
+ }
- j := quickPartition(a, lo, hi)
- quick(a, lo, j-1)
- quick(a, j+1, hi)
+ j := quickPartition(a, lo, hi)
+
+ quick(a, lo, j-1)
+ quick(a, j+1, hi)
}
func quickPartition(a ds.ArrayList, lo, hi int) int {
- i := lo // Left scan index
- j := hi+1 // Right scan index
- v := a[lo] // Partitioning item
-
- for {
- // Scan left
- for {
- i++
- if i == hi {
- break
- }
- if a[i].Lower(v) {
- continue
- }
- break
- }
-
- // Scan right
- for {
- j--
- if j == lo {
- break
- }
- if v.Lower(a[j]) {
- continue
- }
- break
- }
-
- // Check scan complete
- if i >= j {
- break
- }
-
- a.Swap(i, j)
- }
-
- // Put partitioning item v into a[j]
- a.Swap(lo, j)
-
- // whith a[lo..j-1 <= a[j] <= a[j+1..hi]
- return j
+ i := lo // Left scan index
+ j := hi + 1 // Right scan index
+
+ insertion(a, lo, lo+2)
+ a.Swap(lo, lo+1)
+ v := a[lo] // Partitioning item
+
+ for {
+ for i++; a[i].Lower(v); i++ {
+ if i == hi {
+ break
+ }
+ }
+
+ for j--; v.Lower(a[j]); j-- {
+ if j == lo {
+ break
+ }
+ }
+
+ // Check scan complete
+ if i >= j {
+ break
+ }
+
+ a.Swap(i, j)
+ }
+
+ // Put partitioning item v into a[j]
+ a.Swap(lo, j)
+
+ // whith a[lo..j-1 <= a[j] <= a[j+1..hi]
+ return j
}