JS写快速排序算法的问题
看了下python的快速排序算法的代码想着用js代码复刻一下,但是出现了调用栈超出的问题:
- python代码
def qsort(arr):
if len(arr)<=1:
return arr
else:
pivot = arr[0]
left = [x for x in arr[1:] if x < pivot]
right = [x for x in arr[1:] if x >= pivot]
return qsort(left) + [pivot] + qsort(right)
# 语法糖(简直不要太赞)
qs = lambda xs:((len(xs) <= 1 and [xs]) or [qs([x for x in xs[1:] if x < xs[0]]) + [xs[0]] + qs([x for x in xs[1:] if x > xs[0]])])[0]
# 测试
if __name__ == '__main__':
a = [5,4,7,9,1,3,0,2,6,8]
print(qsort(a)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- JS代码
// 采用上述python代码的形式
function qsort(arr){
var pivot,left,right;
if (arr.length <=1){
return arr;
}
pivot = arr[0];
left = arr.filter((ele)=>{return ele<pivot});
right = arr.filter((ele)=>{return ele>=pivot});
return qsort(left).concat(pivot,qsort(right));
// return [...qsort(left),pivot,...qsort(right)];
}
var a = [5,4,7,9,1,3,0,2,6,8];
qsort(a) // Uncaught RangeError: Maximum call stack size exceeded
采用这种形式写,报出超出最大调用栈大小的问题,但是python里头没有这个问题,且递归深度应该也不大啊(不知道问题点,看有没有大神指教),最后还是换了种形式后实现:
function qs(arr){
var pivot = arr[0],left = [],right = [];
if (arr.length<=1)
return arr;
for (let i = 1; i<arr.length;i++){
if (arr[i]<pivot){
left.push(arr[i]);
}else{
right.push(arr[i])
}
}
return [...qs(left),pivot,...qs(right)]
}