1. 程式人生 > >js演算法:分治法-歸併排序

js演算法:分治法-歸併排序

歸併排序(合併排序)是一個遞迴演算法,這個演算法的理解其實可以藉助下面這個圖:

對於原始的陣列2,1,3,8,5,7,6,4,10,在整個過程執行的是順序是途中紅色編號1-20。雖然我們描述中說的是程式先分解,再歸併,但實際過程是一邊分解一邊歸併,前半部分分先排好序,後半部分再拍好,最後整個歸併為一個完整的序列,途中的merge過程它所在層的兩個序列的merge過程:下圖展示了每個merge過程對作用於陣列的哪部分(紅色)。

整個過程就像一個動態的樹,執行順序就是對樹的先序遍歷順序。

下面用JS演示歸併排序過程

附程式碼:

<span style="font-size:14px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> js歸併排序 </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
  <script type="text/javascript" src="json2.js"></script>
  <style>
  table,td{
    border:1px solid gray;
	text-align:center;
	color:white;
  }
  </style>
  <script>
    var array;
	var left,right;
	function init(){
	  array=$("#arr1").val().split(',');
	  left=0;
	  right=array.length-1;
	  $("#detail").html('');
	}
    function sort(){
	   mergeSort(array,left,right);
	}

	function mergeSort(array,lo,hi){
	   //alert(lo+":"+hi);
	   if(lo>=hi)return;
	   var mid=lo+parseInt((hi-lo)/2);
	   mergeSort(array,lo,mid);
	   //$("#detail").append("left sort("+lo+","+mid+")<br/>");
	   mergeSort(array,mid+1,hi);
	   //$("#detail").append("right sort("+(mid+1)+","+hi+")<br/>");
	   
	   $("#detail").append("merge("+lo+","+mid+","+hi+")<br/>");
	   merge(array,lo,mid,hi);
	}

	function merge(array,lo,mid,hi){
	  var i=lo,j=mid+1;
	  var aux=[];
	  for(var k=lo;k<=hi;k++){
	     aux[k]=array[k];
	  }
	  for(var a=lo;a<=hi;a++){
	    if(i>mid){		
		  array[a]=aux[j++];
		}else if(j>hi){		
		  array[a]=aux[i++];
		}else if(parseInt(aux[i])<parseInt(aux[j])){		
		  array[a]=aux[i++];
		}else{		
		  array[a]=aux[j++];
		}
	  }
	  alert("aux:"+aux.join()+"  array:"+array.join());
	  $("#lab2").text(array.join());	
	}
  </script>
 </HEAD>
 <BODY style="text-align:center">
    資料:
	<input type="text" name="arr1" id="arr1" style="width:600px" value="2,1,3,8,5,7,6,4,10"/>
	<br/>
	<input type="button" value="初始化" onclick="init()"/>
	<input type="button" value="合併排序" onclick="sort()"/>
	<br/>
	合併結果陣列:<label id="lab2"></label><br/>
	<div id="detail" style="border:1px solid blue;width:500px;height:100%;margin:0  auto;text-align:left;padding-left:20px;">
	</div>
 </BODY>
</HTML>
</span>
    本文參考了部落格