递归实现:
function merge(left,right){
var result=[];
while(left.length>0 && right.length>0){
if(left[0]<right[0]){
result.push(left.shift());
} else{
result.push(right.shift());
}
}
return result.concat(left).concat(right);
}
function mergeSort(items){
if(items.length == 1){
return items;
}
var middle=Math.floor(items.length/2),
left=items.slice(0,middle),
right=items.slice(middle);
return merge(mergeSort(left),mergeSort(right));
}
var items=[4,3,2,77,23,1,5];
var newitems=mergeSort(items);
alert(newitems);
递归算法会频繁的调用mergeSort()。
迭代实现:
function merge(left,right){
var result=[];
while(left.length>0 && right.length>0){
if(left[0]<right[0]){
result.push(left.shift());
} else{
result.push(right.shift());
}
}
return result.concat(left).concat(right);
}
function merSort(items){
if(items.length == 1){
return items;
}
var work=[];
for(var i=0,len=items.length;i<len;i++){
work.push([items[i]]);
}
work.push([]); //如果数组长度为奇数
for(var lim=len;lim>1;lim=(lim+1)/2){
for(var j=0,k=0;k<lim;j++,k+=2){
work[j]=merge(work[k],work[k+1]);
}
work[j]=[];
}
return work[0];
}
var items=[4,3,2,77,23,1];
var newitems=merSort(items);
alert(newitems);
迭代算法的排序效率比递归慢一点,但不会受调用栈限制的影响。将递归算法改用迭代实现式避免栈溢出错误的方法之一。
参考:《高性能JavaScript》