为何这段JavaScript快速排序方法仅返回数组中的单个元素?
分析你的快速排序代码问题
你的代码执行后只返回单个元素,主要是因为几个关键的语法和逻辑错误,我来一步步拆解:
1. 循环起始索引错误
你在循环里写了for (var i = 1; i < len; i++),但这里有个问题:你先执行了var temp = arra.pop();,这会让原数组arra的长度减少1(从原来的len变成len-1)。而循环从i=1开始,会直接跳过数组的第一个元素(索引0),导致大量元素没有被分到left或right里,最终递归的时候很多分支都是空数组,最后只剩temp被返回。
2. 数组push方法的语法错误
你写了right.push[i];,这里的语法完全错了!数组的push是方法,必须用圆括号调用,应该是right.push(arra[i]);。用方括号的话相当于访问push这个函数对象的i属性,根本没有把元素添加到right数组里,导致right一直是空的。
3. 多余的空数组newarr
你定义了var newarr = [];但完全没用到它,虽然这个不会直接导致错误,但没必要保留,直接用concat拼接排序后的左右数组和基准值就行。
修正后的代码
var arr = [4, 5, 6, 3, 4, 5, 2, 5, 6, 4, 2]; function quickSort(arra) { if (arra.length <= 1) { return arra; } else { var len = arra.length; var left = []; var right = []; var temp = arra.pop(); // 循环从i=0开始,遍历pop后的所有元素 for (var i = 0; i < len - 1; i++) { if (arra[i] < temp) { left.push(arra[i]); } else { // 修正push的语法,用圆括号 right.push(arra[i]); } } } // 去掉多余的newarr,直接拼接 return quickSort(left).concat(temp, quickSort(right)); } console.log(quickSort(arr))
执行这段修正后的代码,就能得到正确的排序结果:[2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6]
内容的提问来源于stack exchange,提问作者Xinyi Li
相关产品推荐
相关产品推荐

