【问题标题】:No output in quicksort快速排序没有输出
【发布时间】:2015-03-13 21:58:03
【问题描述】:

我正在尝试在 JavaScript 中实现快速排序功能:

function partition(l, low, high) {
  l[0] = l[low];
  var pivotkey = l[low];
  while (low < high) {
    while (low < high && pivotkey <= l[high]) {
      --high;
    }
    l[low] = l[high];
    while (low < high && l[low] <= pivotkey) {
      ++low;
    }
    l[high] = l[low];
  }
  l[low] = l[0];
  return low;
}

function qsort(l, low, high) {
  var pivotloc;
  if (low < high) {
    pivotloc = partition(l, low, high);
    qsort(l, low, pivotloc - 1);
    qsort(l, pivotloc + 1, high);
  }
  return;
}

function quickSort(l) {
  qsort(l, 1, l.length - 1);
  return l;
}

console.log(quickSort([0, 1, 4, 3]));

但是这个程序在终端中什么也没输出(node qsort.js)。也许我错过了一些东西。谁能指出我正确的方向?如何调试此类问题?

【问题讨论】:

  • 是 l[0] 一个临时案例还是要排序的数组的一部分????
  • @Meninx 它不是要排序的数组的一部分。请在 C 类版本中查看我的 cmets(URI 在您的答案下注释)。

标签: javascript algorithm sorting quicksort


【解决方案1】:

因此,正如您所说,数组的第一个元素将用作临时变量,该变量仅对算法的执行有用,一开始并不清楚!

您的算法运行良好,但打印结果时遇到问题!

要得到你想要的,你需要通过在quickSort() 块中添加shift() 函数来去掉第一个元素,这样它就变成了:

function quickSort(l) {
  qsort(l, 1, l.length - 1);
  l.shift(); // add this function
  return l;
}

如果您想使用splice() 函数,还有另一种解决方案,它也删除第一个元素并且具有这种形式:

array.splice(indexToRemove, numberToRemove);

所以要获得所需的结果,请将上面的指令添加到您的 quickSort() 函数中,如下所示:

function quickSort(l) {
  qsort(l, 1, l.length - 1);
   l.splice(0, 1); //add this line
  return l;
} 

这是我猜你的问题的两个解决方案。希望有帮助!!

【讨论】:

    【解决方案2】:

    我认为您的算法存在几个问题。但是我可以立即注意到的一个与您在 partition 函数中使用 l.lowl.high 有关。我假设l 是一个数组,在这种情况下,它们都旨在访问lowhigh 处的索引。如果是这种情况,那么这些应该是l[low]l[high]

    由于您似乎正在尝试进行就地版本的快速排序,请查看此处提供的内容:In Place Quick Sort

    【讨论】:

    • 糟糕,l.lowl.high 是拼写错误。我已经在问题/代码中更正了它们,但仍然没有输出。
    • 感谢您的链接顺便说一句。我以前读过 Nicholas 的优秀文章,但我想自己实现一篇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2015-06-12
    • 2017-11-03
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多