Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这种快速排序实现有什么问题?_Javascript_Sorting_Computer Science_Quicksort - Fatal编程技术网

Javascript 这种快速排序实现有什么问题?

Javascript 这种快速排序实现有什么问题?,javascript,sorting,computer-science,quicksort,Javascript,Sorting,Computer Science,Quicksort,我有以下资料: function quickSort(array, low, high) { var len = array.length, l = low || 0, r = high || len - 1, m = Math.round((l + r) / 2), t; do { while (array[l] < array[m]) { l += 1;

我有以下资料:

function quickSort(array, low, high) {
    var len = array.length,
        l = low || 0,
        r = high || len - 1,
        m = Math.round((l + r) / 2),
        t;

    do {
        while (array[l] < array[m]) {
            l += 1;
        }
        while (array[r] > array[m]) {
            r -= 1;
        }

        if (l <= r) {
            if (l < r) {
                t = array[r];
                array[r] = array[l];
                array[l] = t;

                console.log('Swapped ' + array[r] + ' with ' +
                                         array[l] + '. ' +
                                         array);
            }

            l += 1;
            r -= 1;
        }
    } while (l <= r);

    if (r > 0) quickSort(array, 0, r);  
    if (l < len - 1) quickSort(array, l, len - 1);
}
令人惊讶的是,在数组排序后,代码抛出
堆栈溢出。我想我错过了递归退出条件,但我不知道在哪里。

编辑(替换以前的答案):我认为这里的问题是设置
len
变量的方式。对于就地排序,
len
应仅为正在排序的数组部分的长度,而不是整个数组的长度,否则最后的比较结果将永远不会为false。因此,不是:

var len = array.length,
    l = low || 0,
    r = high || len - 1;
您需要根据
l
r
设置
len

var l = low || 0,
    r = high || array.length - 1,
    len = r-l;

您可以在这里看到正在工作的JSFIDLE:-我用一个随机数组替换了您的测试数据进行测试。

您是否尝试手动(手动)对列表进行排序,并查看“交换”的日志行是否匹配。也许您可以在代码中添加一些注释(例如,为什么嵌套了两个几乎相同的if?。@Lycha,是的,交换周期匹配。当我们到达
如果(l不,在这种情况下,数组的右边部分根本不会被排序-在
do…的末尾,
循环
l
将等于
m-1
m
。你可以在你提供的小提琴中检查它-部分排序的数组在9后有8个。@Honneykeepa-你是对的,先生。我再拿一个看看这个-我确实认为这就是逻辑关闭的地方。@Honneykeepa-看看我更新的回答。逻辑关闭了,但这是因为
len
是如何设置的,而不是你在比较什么。这绝对是一个改进!Upvote。但是,函数没有对数组进行适当排序。@nrabinowitz,谢谢你的时间还有帮助。诅咒,你又对了。这将成为快速排序的速成课程。我再看一看。(出于好奇,你知道
array.sort()
可能会快得多,对吧?)
var l = low || 0,
    r = high || array.length - 1,
    len = r-l;