javascript - JS快速排序算法去掉判断就报错?
天蓬老师
天蓬老师 2017-04-10 15:54:35
[JavaScript讨论组]
var arr = [111,2,311,'a',20,90,445];

    var quickSort = function(arr) {  
    if (arr.length <= 1) {
        return arr;
    } else {
        //split for center 
        var pivotIndex = Math.floor(arr.length / 2);

        //get center value
        var pivot = arr.splice(pivotIndex, 1)[0];
          console.log(pivot)
        var left = [];  
            var right = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i]);
            } else {
                    right.push(arr[i]);
            }
         }
     }
    //call me loop
    return quickSort(left).concat([pivot], quickSort(right));
};

    console.log(quickSort(arr));
这样是可以运行的,但是删掉判断数组长度那一段就报错

var arr = [111, 2, 311, 'a', 20, 90, 445];

var quickSort = function(arr) {  

    //split for center 
    var pivotIndex = Math.floor(arr.length / 2);

    //get center value
    var pivot = arr.splice(pivotIndex, 1)[0];
    console.log(pivot)
    var left = [];  
    var right = [];
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    //call me loop
    return quickSort(left).concat([pivot], quickSort(right));
};

console.log(quickSort(arr));
这样就报错了。为嘛?




天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
ringa_lee

因为quickSort函数并不是调用一次,而是会不断的调用自己,注意看函数的最后一句。

每次递归调用的时候,数组长度都不同,而递归必须最终能够返回,快速排序才能出结果,否则就会一直递归下去,直到内存耗尽出现栈溢出错误,程序奔溃。

如果对递归不熟悉,可能不太容易理解整个过程。你可以试着运行下面的简单程序,体会一下递归的过程,你的这个快速排序的思想跟这个是类似的(仅就递归而言)。

var calcSum = function(n) {
    if (n == 1) return 1;
    return n + calcSum(n-1);
};
var sum = calcSum(5); // 计算1~5的和
迷茫

报错信息发出来看看

PHPz

递归调用你没有返回,就会一直不停的调用下去,成了死循环(递归)了

PHP中文网

这是递归函数啊,没有判断会一直执行,当arr.length=1时不添加判断继续执行的话var pivotIndex = Math.floor(arr.length / 2); pivotIndex=0 然后下次执行该函数是 有一个数组长度为0自然就报错了

高洛峰

确实是这样的,递归结束之后是要有返回的,不然函数永远都结束不掉了!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号