diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-01-17 12:40:45 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-01-17 12:40:45 +0100 |
commit | 3e45412327a2654a77944249962b3652e6142299 (patch) | |
tree | bc3bf69452afa055423cbe0c5cfa8ca357df6ccf /src/pkg/sort/sort.go | |
parent | c533680039762cacbc37db8dc7eed074c3e497be (diff) | |
download | golang-upstream/2011.01.12.tar.gz |
Imported Upstream version 2011.01.12upstream/2011.01.12
Diffstat (limited to 'src/pkg/sort/sort.go')
-rw-r--r-- | src/pkg/sort/sort.go | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/pkg/sort/sort.go b/src/pkg/sort/sort.go index c5b848414..02e647fca 100644 --- a/src/pkg/sort/sort.go +++ b/src/pkg/sort/sort.go @@ -63,7 +63,7 @@ func swapRange(data Interface, a, b, n int) { } func doPivot(data Interface, lo, hi int) (midlo, midhi int) { - m := (lo + hi) / 2 + m := lo + (hi-lo)/2 // Written like this to avoid integer overflow. if hi-lo > 40 { // Tukey's ``Ninther,'' median of three medians of three. s := (hi - lo) / 8 @@ -122,11 +122,19 @@ func doPivot(data Interface, lo, hi int) (midlo, midhi int) { } func quickSort(data Interface, a, b int) { - if b-a > 7 { + for b-a > 7 { mlo, mhi := doPivot(data, a, b) - quickSort(data, a, mlo) - quickSort(data, mhi, b) - } else if b-a > 1 { + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + quickSort(data, a, mlo) + a = mhi // i.e., quickSort(data, mhi, b) + } else { + quickSort(data, mhi, b) + b = mlo // i.e., quickSort(data, a, mlo) + } + } + if b-a > 1 { insertionSort(data, a, b) } } |