diff options
| author | Paul Buetow <paul@buetow.org> | 2020-08-06 11:18:13 +0100 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2020-08-06 11:18:13 +0100 |
| commit | f8cd759c94be1f0daeba46940fac0ca3d4201388 (patch) | |
| tree | 817149e0a1fa331e4d9f74e55910c6dd0d9bc802 /sort/quick.go | |
| parent | d330522b31f9a32e9549745008b596fdca9b17e5 (diff) | |
| parent | ddee1778446fbdf17587fed5ba2b6edc76c05b69 (diff) | |
merge
Diffstat (limited to 'sort/quick.go')
| -rw-r--r-- | sort/quick.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/sort/quick.go b/sort/quick.go new file mode 100644 index 0000000..dde71f9 --- /dev/null +++ b/sort/quick.go @@ -0,0 +1,66 @@ +package sort + +import ( + "algorithms/ds" +) + +func Quick(a ds.ArrayList) ds.ArrayList { + a = Shuffle(a) + quick(a, 0, len(a)-1) + return a +} + +func quick(a ds.ArrayList, lo, hi int) { + if hi <= lo { + return + } + + 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 +} |
