1. 程式人生 > >js演算法:分治法-歸併排序之合併有序陣列

js演算法:分治法-歸併排序之合併有序陣列

     合併有序陣列是合併排序重要的一步,下面js演示了每一步的操作過程 

附程式碼:

<!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 arr1,arr2;
	 var i,hi;
	 var mid;
	 var k;
	 var aux;
	 var j;
	 var array;
     function mergin(){
       var arr1_str=$("#arr1").val();
	   var arr2_str=$("#arr2").val(); 
	   arr1=arr1_str.split(",");
	   arr2=arr2_str.split(",");
	   //alert(arr1_str+","+arr2_str); 
	   $("#lab1,#lab2").text(arr1_str+","+arr2_str);

	   hi=arr1.length+arr2.length-1;
	   mid=arr1.length-1;
	   aux=$("#lab1").text().split(",");
	   j=mid+1;
	   array=$("#lab1").text().split(",");
	   i=0;
	   k=0;
	   $("#detail").html(''); 
	 }
     
	 
	 function nextStep(){	 
	   //var array=$("#lab2").text().split(",");
	   if(k<=hi){	    
	     if(i>mid){//左邊的資料沒有了,直接拷貝右邊的資料
		 $("#detail").append(k+":i="+(i)+"; j="+(j)+"; array[k]="+array[k]+"<br/>");
		   array[k]=aux[j++];		  
		 }else if(j>hi){//右邊資料沒有,直接拷貝左邊的資料
		 $("#detail").append(k+":i="+(i)+"; j="+(j)+"; array[k]="+array[k]+"<br/>");
		   array[k]=aux[i++];		 
		 }else if(parseInt(aux[i])<parseInt(aux[j])){//左邊資料比右邊小,拷貝左邊資料
		   $("#detail").append(k+":aux["+(i)+"]="+aux[i]+"<aux["+(j)+"]="+aux[j]+"; array[k]="+array[k]+"<br/>");
		   array[k]=aux[i++];		    
		 }else{
		    $("#detail").append(k+":aux["+(i)+"]="+aux[i]+">=aux["+(j)+"]="+aux[j]+"; array[k]="+array[k]+"<br/>");
		   array[k]=aux[j++];
		 }
		 k++;		 
         $("#lab2").text(array.join());
	   }else{
	      $("#detail").append("合併排序結束<br/>");
		  alert("合併排序結束!");
	   }
	 }
	//一鍵合併
	function mergeArr(){
	  mergin();
	  for(var a=0;a<=hi;a++){
	    if(i>mid){
		$("#detail").append(a+":i="+(i)+"; j="+(j)+"; array[k]="+array[a]+"<br/>");
		  array[a]=aux[j++];
		}else if(j>hi){
		 $("#detail").append(a+":i="+(i)+"; j="+(j)+"; array[k]="+array[a]+"<br/>");
		  array[a]=aux[i++];
		}else if(parseInt(aux[i])<parseInt(aux[j])){
		 $("#detail").append(a+":aux["+(i)+"]="+aux[i]+"<aux["+(j)+"]="+aux[j]+"; array[k]="+array[a]+"<br/>");
		  array[a]=aux[i++];
		}else{
		 $("#detail").append(a+":aux["+(i)+"]="+aux[i]+">=aux["+(j)+"]="+aux[j]+"; array[k]="+array[a]+"<br/>");
		  array[a]=aux[j++];
		}
	  }
	  $("#lab2").text(array.join());
	  $("#detail").append("合併排序結束<br/>");
	  alert("合併排序結束!");
	}
  </script>
 </HEAD>
 <BODY style="text-align:center">
    陣列一:
	<input type="text" name="arr1" id="arr1" style="width:600px" value="1,3,4,12,33,34"/>
	<br/>
	陣列二:
	<input type="text" name="arr2" id="arr2" style="width:600px" value="4,4,12,35,67,87"/>
	<br/>
	<input type="button" value="初始化" onclick="mergin()"/>
	<input type="button" value="逐步合併" onclick="nextStep()"/>
	<input type="button" value="一鍵合併" onclick="mergeArr()"/> 
	<br/>
	合併初始陣列:<label id="lab1"></label><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>