快速排序,顾名思义效率相比较其他排序方法高,它是一种交换排序
基本思路是
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]