js算法:分治法-快速排序

附代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> 快速排序 </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>
  <script>

    /*在快速排序中,记录的比较和交换是从两端向中间
	进行的,关键字较大的记录一次就能交换到后面单
	元,关键字较小的记录一次就能交换到前面单元,
	记录每次移动的距离较大,因而总的比较和移动次
	数较少。*/
    //快速排序是一种不稳定排序
     var arr=[];	
     
    function init(){  
	   var tempArr=$("#arr1").val().split(",");
	   arr=[];
	   for(var i=0;i<tempArr.length;i++){
	       arr.push(parseInt(tempArr[i]));
	   }
	   $("#detail").html('');
	 }

	 function sort(){
	    qSort(0,arr.length-1);
		$("#detail").append("最终排序结果:"+arr+"<br/>");
	 }


	 function qSort(p,r){	  
	   if(p<r){
	       var q=partition(p,r);//以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何元素小于等于a[q],a[q+1:r]中任何元素大于等于a[q]。下标q在划分过程中确定。
		   //alert("p="+p+";q="+q+";r="+r);
		   qSort(p,q-1);
		   qSort(q+1,r);
	   }
	 }

	 function partition(p,r){
	 //alert("p="+p+":r="+r);
	   var i=p;
	   var j=r;	  
	   var x=arr[p];
	   while(i<j)
	   {
	     //从右边找到小于基准数字的索引
	     while(arr[j]>=x&&i<j){
		    j--;
		 }
		 //从左边做到大于基准数字的索引
		 while(arr[i]<=x&&i<j){
		    i++;
		 }
		 //交换
		 if(i<j){
			 $("#detail").append("交换:"+arr[i]+":"+arr[j]+"<br/>");
			 var temp=arr[i];
			 arr[i]=arr[j]; 
			 arr[j]=temp;
			 
		 }
	   }
	   arr[p]=arr[j];
	   arr[j]=x;

	   $("#detail").append("p="+p+";r="+r+";arr="+arr+"; q="+j+"<br/>");
	   return j; 	   
	 }

	
  </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="初始化" οnclick="init()"/>
	<input type="button" value="快速排序" οnclick="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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值