歸併排序是一種穩定排序,有必要掌握它;以下是詳細代碼加註釋。先看一張歸併排序算法對待排序數組的分割:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>歸併排序</title>
</head>
<body>
<script type="text/javascript">
//歸併排序:首先把數組分成兩半,再分兩半,一直到不可分,數組長度爲1;
//接着調用merge函數,對左右數組排序,然後遞歸,最後實現整個數組的歸併排序。
function mergeSort(arr) {
var len = arr.length;
if(len > 1) {
var index = Math.floor(len / 2);
console.log(index);
var left = arr.slice(0,index); //得到下標從0~index-1的數組
var right = arr.slice(index); //得到下標從index開始到末尾的數組
return merge(mergeSort(left) , mergeSort(right)); //裏面採用遞歸
}else {
return arr;
}
}
function merge(left , right) {
//每次left或者right都是要shift掉第一個元素,表示left或者right是會變化的,最後arr.concat左右數組,
//因爲不知道left或者right其中哪個數組剩下元素,簡單做法,乾脆將left和right數組都進行concat。
var arr = [];
while(left.length && right.length) {
if(left[0] < right[0]) {
arr.push(left.shift());
}else {
arr.push(right.shift());
}
}
//console.log(left+"——"+right);
//可以打印驗證一下每次merge的時候,剩下的是left數組還是right數組裏面的元素;加深對歸併排序的理解
return arr.concat(left , right);
}
var arr=[4,19,60,10,66];
console.log('beforeSort:'+arr);
mergeSort(arr);
console.log('afterSort:'+arr);
</script>
</body>
</html>
瀏覽器F12控制檯打印結果: