Commit 6f1835dc authored by Stefan Nilsson's avatar Stefan Nilsson Committed by Robert Griesemer

Sort: reduced stack depth to lg(n) in quickSort

Doing the tail recursion elimination explicitly
seems safer than leaving it to the compiler;
the code is still clean and easy to understand.

R=r, r2, gri
CC=golang-dev
https://golang.org/cl/3373041
parent 4e40a036
......@@ -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)
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment