您的位置:首页 > 其它

经典排序之二 快速排序 + 二路归并

2017-06-22 15:09 232 查看
快速排序,顾名思义效率相比较其他排序方法高,它是一种交换排序

基本思路是

1:将待排序数组的中间见作为一个参考值

2:大于参考值的 放右边的数组,小于参考值的放左边的数组

3:对左右两个数组做1,2操作,直至数组里只有一个数值

function quickSort(arr){
if(arr.length <=1 ){
return arr;
}
//splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。  会改变原数组
//Math.floor() 方法对一个数进行往下取整 小于等于x,且与x最接近的整数
var temp = arr.splice(Math.floor(arr.length/2),1)[0];
var arrLeft = [];
var arrRight = [];

for(var i=0;i<arr.length;i++){
if(arr[i]>=temp){
arrRight.push(arr[i]);
} else {
arrLeft.push(arr[i]);
}
}
console.log("左边的数组:"+ arrLeft+ "参考值" + temp + "右边的数组:"+ arrRight + "总数组"+ arr)
return quickSort(arrLeft).concat(temp,quickSort(arrRight));
//return arguments.callee(arrLeft).concat(temp,arguments.callee(arrRight)); 不推荐使用arguments.callee
}
var arr1 = [9,2,1,2,8,546,23,0];
quickSort(arr1);
左边的数组:2,1,2,0   参考值8    右边的数组:9,546,23 总数组9,2,1,2,546,23,0
左边的数组:1,0       参考值2    右边的数组:2        总数组2,1,0
左边的数组:          参考值0    右边的数组:1        总数组1
左边的数组:9,23      参考值546  右边的数组:         总数组9,23
左边的数组:9         参考值23   右边的数组:         总数组9
[0, 1, 2, 2, 8, 9, 23, 546]
二路归并

//新的知识点  While 循环会在指定条件为真时循环执行代码块。 只要指定条件为 true,循环就可以一直执行代码。
function merge(left,right){
var result = [],
il= 0,
ir=0;

while(left.length>il && right.length>ir){
if(left[il]<right[ir]){//挨个比较
result.push(left[il++])
} else {
result.push(right[ir++])
}
console.log(result);
}

while(left[il]){//当两个数组的长短不一致,比较完成以后剩余的数字再添加上去
result.push(left[il++])
}

while(right[ir]){
result.push(left[ir++])
}
}
var arr1 = [2,3,4,78,90,100];
var arr2 = [1,58,77,79,91];
merge(arr1,arr2)

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 58]
[1, 2, 3, 4, 58, 77]
[1, 2, 3, 4, 58, 77, 78]
[1, 2, 3, 4, 58, 77, 78, 79]
[1, 2, 3, 4, 58, 77, 78, 79, 90]
[1, 2, 3, 4, 58, 77, 78, 79, 90, 91]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: