Various minor improvements of sort.
Review URL: http://codereview.chromium.org/6035 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@405 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
8d617a7b6b
commit
e61b803414
32
src/array.js
32
src/array.js
@ -650,14 +650,10 @@ function ArraySort(comparefn) {
|
||||
// In-place QuickSort algorithm.
|
||||
// For short (length <= 22) arrays, insertion sort is used for efficiency.
|
||||
|
||||
var custom_compare = IS_FUNCTION(comparefn);
|
||||
|
||||
function Compare(x,y) {
|
||||
if (IS_UNDEFINED(x)) {
|
||||
if (IS_UNDEFINED(y)) return 0;
|
||||
return 1;
|
||||
}
|
||||
if (IS_UNDEFINED(y)) return -1;
|
||||
|
||||
if (IS_FUNCTION(comparefn)) {
|
||||
if (custom_compare) {
|
||||
return comparefn.call(null, x, y);
|
||||
}
|
||||
if (%_IsSmi(x) && %_IsSmi(y)) {
|
||||
@ -691,15 +687,13 @@ function ArraySort(comparefn) {
|
||||
}
|
||||
}
|
||||
// place element at position min==max.
|
||||
for (var j = min; j < i; j++) {
|
||||
var tmp = a[j];
|
||||
a[j] = element;
|
||||
element = tmp;
|
||||
for (var j = i; j > min; j--) {
|
||||
a[j] = a[j - 1];
|
||||
}
|
||||
a[i] = element;
|
||||
a[min] = element;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function QuickSort(a, from, to) {
|
||||
// Insertion sort is faster for short arrays.
|
||||
if (to - from <= 22) {
|
||||
@ -743,6 +737,18 @@ function ArraySort(comparefn) {
|
||||
%RemoveArrayHoles(this);
|
||||
|
||||
var length = ToUint32(this.length);
|
||||
|
||||
// Move undefined elements to the end of the array.
|
||||
for (var i = 0; i < length; ) {
|
||||
if (IS_UNDEFINED(this[i])) {
|
||||
length--;
|
||||
this[i] = this[length];
|
||||
this[length] = undefined;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
QuickSort(this, 0, length);
|
||||
|
||||
// We only changed the length of the this object (in
|
||||
|
Loading…
Reference in New Issue
Block a user