Chromium Code Reviews| Index: src/array.js |
| =================================================================== |
| --- src/array.js (revision 11853) |
| +++ src/array.js (working copy) |
| @@ -777,18 +777,36 @@ |
| } |
| }; |
| + var GetThirdIndex = function(a, from, to) { |
| + var t_array = []; |
|
danno
2012/06/19 14:52:17
How about creating an InternalArray of the appropr
Erik Corry
2012/06/19 18:36:29
OK I tried that and it ended badly. I have to be
danno
2012/06/19 19:55:55
Nah, it's fine. I'd rather have the readable code
|
| + // Use both 'from' and 'to' to determine the pivot candidates. |
| + var increment = 200 + ((to - from) & 15); |
| + for (var i = from + 1; i < to - 1; i += increment) { |
| + t_array.push([i, a[i]]); |
| + } |
| + t_array.sort(function(a, b) { |
| + return %_CallFunction(receiver, a[1], b[1], comparefn) } ); |
| + var third_index = t_array[t_array.length >> 1][0]; |
| + return third_index; |
| + } |
| + |
| var QuickSort = function QuickSort(a, from, to) { |
| + var third_index = 0; |
| while (true) { |
| // Insertion sort is faster for short arrays. |
| if (to - from <= 10) { |
| InsertionSort(a, from, to); |
| return; |
| } |
| + if (to - from > 1000) { |
| + third_index = GetThirdIndex(a, from, to); |
|
danno
2012/06/19 14:52:17
It still seems to be the case that you can careful
Erik Corry
2012/06/19 18:36:29
I think we don't as long as it can't happen accide
|
| + } else { |
| + third_index = from + ((to - from) >> 1); |
| + } |
| // Find a pivot as the median of first, last and middle element. |
| var v0 = a[from]; |
| var v1 = a[to - 1]; |
| - var middle_index = from + ((to - from) >> 1); |
| - var v2 = a[middle_index]; |
| + var v2 = a[third_index]; |
| var c01 = %_CallFunction(receiver, v0, v1, comparefn); |
| if (c01 > 0) { |
| // v1 < v0, so swap them. |
| @@ -819,7 +837,7 @@ |
| var pivot = v1; |
| var low_end = from + 1; // Upper bound of elements lower than pivot. |
| var high_start = to - 1; // Lower bound of elements greater than pivot. |
| - a[middle_index] = a[low_end]; |
| + a[third_index] = a[low_end]; |
| a[low_end] = pivot; |
| // From low_end to i are elements equal to pivot. |