首先回顧下用法:
arrayObject.sort(*sortby*)
這里sortby是每次比較兩個值時,所使用的比較函數(shù)。
第一個問題:sort的背后使用了哪一套排序算法?
Paste_Image.png
由攜程設(shè)計委員會的文章的文章我們知道,在v8,Array.js中,
<blockquote>
代碼中做過判斷,數(shù)量小于或等于10的時候 走的是插入排序(InsertionSort);否則快速排序(QuickSort)
對排序算法如果有了解的應(yīng)該知道 InsertionSort是穩(wěn)定的排序算法,QuickSort則是不穩(wěn)定的算法。
</blockquote>
第二個問題,在哪里調(diào)用了sortby?
如果上面的代碼略抽象,我們不妨自己寫個快排:
//(1)在數(shù)據(jù)集之中,選擇一個元素作為"基準"(pivot)。
//(2)所有小于"基準"的元素,都移到"基準"的左邊;所有大于"基準"的元素,都移到"基準"的右邊。
//(3)對"基準"左邊和右邊的兩個子集,不斷重復(fù)第一步和第二步,直到所有子集只剩下一個元素為止。
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排序算法實現(xiàn)。
第三個問題:我們知道了上面的東西,是不是可以騙騙人?
答案是可以:
var list = [1,2,3,4,5,6,7,8,9,0];
console.log(
list.sort(function() {
return Math.random() - 0.5
})
);
一種優(yōu)雅的亂序。