首先回顾下用法:
arrayObject.sort(*sortby*)
这里sortby是每次比较两个值时,所使用的比较函数。
第一个问题:sort的背后使用了哪一套排序算法?
由携程设计委员会的文章的文章我们知道,在v8,Array.js中,
<blockquote>
代码中做过判断,数量小于或等于10的时候 走的是插入排序(InsertionSort);否则快速排序(QuickSort)
对排序算法如果有了解的应该知道 InsertionSort是稳定的排序算法,QuickSort则是不稳定的算法。
</blockquote>
第二个问题,在哪里调用了sortby?
如果上面的代码略抽象,我们不妨自己写个快排:
//(1)在数据集之中,选择一个元素作为"基准"(pivot)。
//(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
//(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
function sort6(array) {
var tmp_array = array.slice(0),
result, quickSort = function(arr) {
if (arr.length <= 1) {
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) { //sortby用在这里
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
result = quickSort(tmp_array);
return result;
}
上面的代码出自排序图解:js排序算法实现。
第三个问题:我们知道了上面的东西,是不是可以骗骗人?
答案是可以:
var list = [1,2,3,4,5,6,7,8,9,0];
console.log(
list.sort(function() {
return Math.random() - 0.5
})
);
一种优雅的乱序。