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); |