Skip to content

Commit

Permalink
Faster sort.
Browse files Browse the repository at this point in the history
Using insertion sort below a certain threshold to give faster sorting of arrays (esp. short ones).
Review URL: http://codereview.chromium.org/6006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@395 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
  • Loading branch information
olehougaard committed Sep 30, 2008
1 parent 61f3a82 commit b4a40eb
Showing 1 changed file with 37 additions and 1 deletion.
38 changes: 37 additions & 1 deletion src/array.js
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,7 @@ function ArraySplice(start, delete_count) {

function ArraySort(comparefn) {
// In-place QuickSort algorithm.
// For short (length <= 22) arrays, insertion sort is used for efficiency.

function Compare(x,y) {
if (IS_UNDEFINED(x)) {
Expand All @@ -668,8 +669,43 @@ function ArraySort(comparefn) {
else return x < y ? -1 : 1;
};

function InsertionSort(a, from, to) {
for (var i = from + 1; i < to; i++) {
var element = a[i];
// place element in a[from..i[
// binary search
var min = from;
var max = i;
// The search interval is a[min..max[
while (min < max) {
var mid = min + ((max - min) >> 1);
var order = Compare(a[mid], element);
if (order == 0) {
min = max = mid;
break;
}
if (order < 0) {
min = mid + 1;
} else {
max = mid;
}
}
// place element at position min==max.
for (var j = min; j < i; j++) {
var tmp = a[j];
a[j] = element;
element = tmp;
}
a[i] = element;
}
}

function QuickSort(a, from, to) {
if (from >= to - 1) return;
// Insertion sort is faster for short arrays.
if (to - from <= 22) {
InsertionSort(a, from, to);
return;
}
var pivot_index = $floor($random() * (to - from)) + from;
var pivot = a[pivot_index];
// Issue 95: Keep the pivot element out of the comparisons to avoid
Expand Down

0 comments on commit b4a40eb

Please sign in to comment.