利用递归实现合并排序算法
缺点:递归算法可能会造成调用栈溢出
优点:速度相对快,逻辑清晰
var arr=[1,4,2,5,8,5,6,10,9,7,3];
console.log(mergeSort(arr))
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,right);
}
function mergeSort(arr){
if(arr.length==1){
return arr;
}
var middle=Math.floor(arr.length/2);
var left=arr.slice(0,middle);
var right=arr.slice(middle);
console.log(left,right)
return merge(mergeSort(left),mergeSort(right));
}
利用迭代实现合并排序算法
缺点:速度相对递归笔记慢。
优点:可解决调用栈溢出的问题。
var arr=[1,4,2,5,8,5,6,10,9,7,3];
console.log(mergeSort(arr))
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,right);
}
function mergeSort(arr){
if(arr.length===1){
return arr;
}
var work=[];
for(var i=0,item;item=arr[i++];){
work.push([item]);
}
work.push([]);
console.log(work)
for(var lim=arr.length;lim>1;lim=(lim+1)/2){
for(var j=0,k=0;k<lim;j++,k+=2){
console.log(work[k],work[k+1])
work[j]=merge(work[k],work[k+1]);
}
work[j]=[]
}
return work[0];
}