各种排序 js实现

归并排序:

递归方法

function sortB(ary){
  if(ary.length<=1){
      return ary[0].constructor==Array?ary[0]:ary;
  }else{
     var tempAry=[];
     for(var i=0;i<ary.length;i=i+2){
         if(ary[i+1]!=undefined){
         tempAry[i/2]=sortIn(ary[i],ary[i+1]);
         }else{
         tempAry[i/2]=ary[i];
         }  

     }
     return  sortB(tempAry);
  }
}
function sortIn(ary1,ary2){
     if(typeof ary1!="object"){
      ary1=[ary1];
     }
      if(typeof ary2!="object"){
      ary2=[ary2];
     }
    var ary=[];
    var i=0,j=0;
  while(i<ary1.length&&j<ary2.length){
         if(ary1[i]<=ary2[j]){
          ary.push(ary1[i]);
          i++;
         }else{
          ary.push(ary2[j]);
          j++;
         }
    }
    if(i<ary1.length){
           for(var m=i;m<ary1.length;m++){
           ary.push(ary1[m]);
           }
    }else{
       for(var m=j;m<ary2.length;m++){
           ary.push(ary2[m]);
           }
    }   
       return ary;
  }

非递归方法

function sortA(ary){
   while(ary.length>1){
     var tempAry=[];
     for(var i=0;i<ary.length;i=i+2){
         if(ary[i+1]!=undefined){
         tempAry[i/2]=sortIn(ary[i],ary[i+1]);
         }else{
         tempAry[i/2]=ary[i];
         }  

     }
     ary=tempAry;
  }
  return ary[0].constructor==Array?ary[0]:ary;
}

function sortIn(ary1,ary2){
		debugger;
	   if(typeof ary1!="object"){
	    ary1=[ary1];
	   }
	    if(typeof ary2!="object"){
	    ary2=[ary2];
	   }
		var ary=[];
		var i=0,j=0;
	while(i<ary1.length&&j<ary2.length){
         if(ary1[i]<=ary2[j]){
          ary.push(ary1[i]);
          i++;
         }else{
          ary.push(ary2[j]);
          j++;
         }
	  }
		if(i<ary1.length){
           for(var m=i;m<ary1.length;m++){
           ary.push(ary1[m]);
           }
		}else{
		   for(var m=j;m<ary2.length;m++){
           ary.push(ary2[m]);
           }
		}		
       return ary;
	}

快速排序(冒泡排序升级版)

递归方法:

function sortA(ary){
  if(ary.length==1||ary.length==0){
   return ary;
  }
  var index= parseInt(ary.length/2);
  var left=[];
  var right=[];
  for(var i=0;i<ary.length;i++){
	if(i==index) continue;				   
    if(ary[i]<=ary[index]){
      left.push(ary[i]);
    }else{
      right.push(ary[i]);
    }
  }
  return  sortA(left).concat([ary[index]]).concat(sortA(right))
}

非递归方法

function sortB(ary){
  if(ary.length<=1) return ary;
  var i=0;
  var count=ary.length;
  var temp=[ary];
  while(temp.length<count){
     var tempAry=[]
     for(var i=0;i<temp.length;i++){
       if(temp[i].length&&temp[i].length>1){
         tempAry=tempAry.concat(cut(temp[i]));
       }else{
         tempAry.push(temp[i]);
       }
     }    
    temp=tempAry;
  }
   return temp;
}

 function cut(ary){
    var index= parseInt(ary.length/2);
    var left=[];
    var right=[];
    var result=[];
    for(var i=0;i<ary.length;i++){
    if(i==index) continue;    
      if(ary[i]<=ary[index]){
        left.push(ary[i]);
      }else{
        right.push(ary[i]);
      }
    }
    if(left.length>1){
     result.push(left);
    }else if(left.length==1){
	 result.push(left[0]);	
	}
     result.push(ary[index]);
    if(right.length>1){
     result.push(right);
    }else if(right.length==1){
	 result.push(right[0]);	
	}
    return  result;
 }

 

转载于:https://my.oschina.net/u/3071114/blog/1359307

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值