Protect quicksort pivot index from overflow.
authorW. Trevor King <wking@drexel.edu>
Mon, 25 Oct 2010 15:55:31 +0000 (11:55 -0400)
committerW. Trevor King <wking@drexel.edu>
Mon, 25 Oct 2010 15:55:31 +0000 (11:55 -0400)
Mentioned on
  http://en.wikipedia.org/wiki/Quicksort

  Note the left + (right-left)/2 expression. (left + right)/2 would
  seem to be adequate, but in the presence of overflow, can give the
  wrong answer; for example, in signed 16-bit arithmetic, 32000 +
  32000 is not 64000 but -1536, and dividing that number by two will
  give you a new pivotIndex of -768 — obviously wrong.

src/sorting/quicksort.c

index 0d82e07d33898cab7bef71ee0cf9e5530ce7786b..d763335d14e4eae72d6deb1ffc1329f1d1fbed6a 100644 (file)
@@ -16,7 +16,7 @@ void swap(double *x, double *y)
 
 int choose_pivot(int i, int j)
 {
-       return ((i + j) / 2);
+       return i + (j - i) / 2;
 }
 
 /* sort the list from list[m] to list[n] */