学习算法 javascript 实现,写一个简单的快速排序,在浏览器中一直报错。代码:
function quickSort(arr){ var len; len=arr.length; if (len <= 1) { return arr; //如果数组只有一个数,就直接返回; } var midlen = Math.floor(len/2); var mid = arr[midlen]; // console.log(mid); var left = []; var right = []; for (var i = 0; i < len; i++) { if (arr[i] < mid) { left.push(arr[i]); } else { right.push(arr[i]); } } // console.log(left.concat([mid],right)); return quickSort(left).concat([mid], quickSort(right)); } //test console.log(quickSort([9, 2, 8, 5, 1]));
数据分析师2017-10-01 01:08:14
javascript 빠른 정렬 오류, 어디에서 잘못되었나요? -PHP 중국어 웹사이트 Q&A-javascript 빠른 정렬 오류가 없습니다. 어디가 잘못되었나요? -PHP 중국어 홈페이지 Q&A
꼭 보고 배워보세요.
阿神2017-03-25 13:12:36
死循环,堆栈溢出了。right数组有两项,9,8.递归执行的时候始终是9,8.
因为此时mid是8,ara[i]始终>=mid,right数组始终是9,8.就死循环了。
正确写法如下:
function quickSort(arr){ var len; len=arr.length; if (len <= 1) { return arr; //如果数组只有一个数,就直接返回; } var midlen = Math.floor(len/2); // var mid = arr[midlen]; var mid = arr.splice(midlen,1)[0]; // console.log(mid); var left = []; var right = []; for (var i = 0,len=arr.length; i < len; i++) { if (arr[i] <= mid) { left.push(arr[i]); } else { right.push(arr[i]); } } // console.log(left.concat([mid],right)); return quickSort(left).concat([mid], quickSort(right)); }//testconsole.log(quickSort([9, 2, 8, 5, 1]));//输出:[ 1, 2, 5, 8, 9 ]