javascript - 这个 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;
        }
        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);
}

使用方法如下:

var initial = [1, 8, 9, 0, 2, 5, 6, 7, 3, 4, 10], // Duplicate, just to compare
    sorted  = [1, 8, 9, 0, 2, 5, 6, 7, 3, 4, 10];

quickSort(sorted);

console.log('Initial: ' + initial + '\nSorted:  ' + sorted);

令人惊讶的是,代码在数组排序后抛出 stack_overflow。我想我错过了递归退出条件,但我不知道在哪里。

最佳答案

编辑(替换之前的答案):我认为这里的问题是您设置 len 变量的方式。对于就地排序,len 应该只是被排序的数组部分的长度,而不是整个数组,否则最后的比较永远不会计算为 false。所以不是:

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

需要根据lr设置len:

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

您可以在此处查看工作中的 jsFiddle:http://jsfiddle.net/nrabinowitz/PPeh9/6/ - 我用随机数组替换了你的测试数据进行测试。

关于javascript - 这个 QuickSort 实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7879522/

相关文章:

algorithm - 最大流量寻找最有利可图的安排

algorithm - 通过缩减建立的下限是否严格?

javascript - 我如何仅在任何现代浏览器(如 chrome、firefox、safari、opera、IE)中关闭当前选项卡,并且具有通用 JavaScript 的任何版本

javascript - 按键组合两个对象数组,并将第二个数组的值插入第一个数组内的新数组

ruby - 使用多个标准对二维数组进行排序

r - 在数据表输出中格式化日期

sorting - groovy中的列表排序

javascript - 如何在网页中创建 HTML 和 CSS 编辑器?

javascript - 如何使用 Three.js 按窗口宽度缩放内容?

javascript - 需要运行 javascript 后从 php 加载的动态图像