js——歸併排序(mergeSort)代碼實現

歸併排序是一種穩定排序,有必要掌握它;以下是詳細代碼加註釋。先看一張歸併排序算法對待排序數組的分割:

歸併排序示意圖

<!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控制檯打印結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章