Index: src/array.js |
=================================================================== |
--- src/array.js (revision 361) |
+++ src/array.js (working copy) |
@@ -669,62 +669,33 @@ |
else return x < y ? -1 : 1; |
}; |
- var old_length = ToUint32(this.length); |
- |
- %RemoveArrayHoles(this); |
- |
- var length = ToUint32(this.length); |
- |
- // Bottom-up max-heap construction. |
- for (var i = 1; i < length; ++i) { |
- var child_index = i; |
- while (child_index > 0) { |
- var parent_index = ((child_index + 1) >> 1) - 1; |
- var parent_value = this[parent_index], child_value = this[child_index]; |
- if (Compare(parent_value, child_value) < 0) { |
- this[parent_index] = child_value; |
- this[child_index] = parent_value; |
- } else { |
- break; |
+ function QuickSort(a, from, to) { |
+ if (from >= to - 1) return; |
+ var pivot_index = global.Math.floor(global.Math.random() * (to - from)) + from; |
Mads Ager (chromium)
2008/09/24 12:34:43
We need to make sure that we use the original Math
|
+ 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 element = a[i]; |
+ if (Compare(element, pivot) < 0) { |
+ a[i] = a[partition]; |
+ a[partition] = element; |
+ partition++; |
} |
- child_index = parent_index; |
} |
+ a[to - 1] = a[partition]; |
+ a[partition] = pivot; |
+ QuickSort(a, from, partition); |
+ QuickSort(a, partition + 1, to); |
} |
- // Extract element and create sorted array. |
- for (var i = length - 1; i > 0; --i) { |
- // Put the max element at the back of the array. |
- var t0 = this[0]; this[0] = this[i]; this[i] = t0; |
- // Sift down the new top element. |
- var parent_index = 0; |
- while (true) { |
- var child_index = ((parent_index + 1) << 1) - 1; |
- if (child_index >= i) break; |
- var child1_value = this[child_index]; |
- var child2_value = this[child_index + 1]; |
- var parent_value = this[parent_index]; |
- if (child_index + 1 >= i || Compare(child1_value, child2_value) > 0) { |
- if (Compare(parent_value, child1_value) > 0) break; |
- this[child_index] = parent_value; |
- this[parent_index] = child1_value; |
- parent_index = child_index; |
- } else { |
- if (Compare(parent_value, child2_value) > 0) break; |
- this[child_index + 1] = parent_value; |
- this[parent_index] = child2_value; |
- parent_index = child_index + 1; |
- } |
- } |
- } |
+ var old_length = ToUint32(this.length); |
- // We only changed the length of the this object (in |
- // RemoveArrayHoles) if it was an array. We are not allowed to set |
- // the length of the this object if it is not an array because this |
- // might introduce a new length property. |
- if (IS_ARRAY(this)) { |
Mads Ager (chromium)
2008/09/24 12:34:43
This piece of code should still be needed. If we
|
- this.length = old_length; |
- } |
+ %RemoveArrayHoles(this); |
+ var length = ToUint32(this.length); |
mdakin
2008/09/25 14:25:28
Maybe using insertion sort for small arrays (<10 e
|
+ QuickSort(this, 0, length); |
return this; |
}; |