| Index: src/array.js
|
| ===================================================================
|
| --- src/array.js (revision 374)
|
| +++ src/array.js (working copy)
|
| @@ -647,7 +647,7 @@
|
|
|
|
|
| function ArraySort(comparefn) {
|
| - // Standard in-place HeapSort algorithm.
|
| + // In-place QuickSort algorithm.
|
|
|
| function Compare(x,y) {
|
| if (IS_UNDEFINED(x)) {
|
| @@ -672,21 +672,26 @@
|
| if (from >= to - 1) return;
|
| var pivot_index = $floor($random() * (to - from)) + from;
|
| var pivot = a[pivot_index];
|
| - a[pivot_index] = a[to - 1];
|
| - a[to - 1] = pivot;
|
| - var partition = from;
|
| - for (var i = from; i < to - 1; i++) {
|
| + var low_end = from; // Upper bound of the elements lower than pivot.
|
| + var high_start = to; // Lower bound of the elements greater than pivot.
|
| + for (var i = from; i < high_start; ) {
|
| var element = a[i];
|
| - if (Compare(element, pivot) < 0) {
|
| - a[i] = a[partition];
|
| - a[partition] = element;
|
| - partition++;
|
| + var order = Compare(element, pivot);
|
| + if (order < 0) {
|
| + a[i] = a[low_end];
|
| + a[low_end] = element;
|
| + low_end++;
|
| + i++;
|
| + } else if (order > 0) {
|
| + high_start--;
|
| + a[i] = a[high_start];
|
| + a[high_start] = element;
|
| + } else { // order == 0
|
| + i++;
|
| }
|
| }
|
| - a[to - 1] = a[partition];
|
| - a[partition] = pivot;
|
| - QuickSort(a, from, partition);
|
| - QuickSort(a, partition + 1, to);
|
| + QuickSort(a, from, low_end);
|
| + QuickSort(a, high_start, to);
|
| }
|
|
|
| var old_length = ToUint32(this.length);
|
|
|