上代码:
<script type="text/javascript">
var arr=[12,20,5,16,15,1,30,45,23,9];
console.log(' 初始为: '+ arr);
function quickSort(arr){
//如果数组<=1,则直接返回
if(arr.length<=1){return arr;}
var pivotIndex=Math.floor(arr.length/2);
//找基准,并把基准从原数组删除
var pivot=arr.splice(pivotIndex,1)[0];
//定义左右数组
var left=[];
var right=[];
//比基准小的放在left,比基准大的放在right
for(var i=0;i<arr.length;i++){
if(arr[i]<=pivot){
left.push(arr[i]);
}
else{
right.push(arr[i]);
}
}
//递归
return quickSort(left).concat([pivot],quickSort(right));
}
</script>
一开始的初始为[ 12,20,5,16,15,1,30,45,23,9];
这段代码的意思为判断arr 这个数组的长度是否为一个(判断是否为一个数),是则让它返回这个数组;
好了现在来分析代码:
[ 12,20,5,14,15,21,30,45,23,9];这段代码
先除与2取到中间值也就是elements的长度除以2,向下取证取到下标4 也就是15这个数
15作为基准数,比15小的放到15的左边,比15大的放到15的右边
左边:12,5,14,9;
右边:20,21,30,45,23;
之后调用递归函数,再讲left这个比15小的数组分解
第一次循环得到左边 left 的值:{
left 为 12,5,14,9; 用他的长度在除以2,向下取证 取到5 用5做判断 ,小于5的放到left里,大于5 的放到right中 得到
left为空 基准数为5 right为 12,14, 9;
在将right[15,14,9]这个数组的长度在除以2 向下取整,得到14; 再讲比14小的放到left中去,比14大的放到right中 得到
left :9 , 12 基准数为14 right为 空;
left为 9 , 12 ;所以需要在分解,下标为0取值为9 所以left为空,right为12;(因就剩一个值,所以不做过多分解,如还有数,将进行继续分解);
最后循环完成的值就为 5 , 9 , 12,14;
}
第一次循环的到右边right的值{
right为:20,21,30,45,23; 用right的长度除以二,向下取整得到 得到30 所以将比30小的放到左边,比30大的放到右边;
left : 20 ,21 , 23, 基准值 30; right:45;(此处的right因为只剩一个值,所以判断一次就结束得到最大值45,若有多次,还需分解)
left: 20,21,23; 的长度除以2 向下取整得到 下标1 21,所以把比21小的放左边,大的放右边
得到 left :20 基准值 21 right 23;
此处的left和right还需在分解判断一次(但因为就剩一个值,所以此处不做分解)
最后循环出来值为 20 ,21,23,30,45;
}
所以最后的值就为 left :5 , 9 , 12 ,14; 基准值: 15 right: 20 ,21,23,30,45;
最后字符串拼接得 5 , 9 , 12 ,14,15,20 ,21,23,30,45;
网友评论