diff options
Diffstat (limited to 'sort/quick.go')
| -rw-r--r-- | sort/quick.go | 95 |
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 } |
