【问题标题】:recursion in my quicksort我的快速排序中的递归
【发布时间】:2018-02-14 09:49:28
【问题描述】:

我目前正在尝试在 javascript 中对数组实现快速排序。我有整体布局,但由于某种原因递归不起作用。它似乎适用于代码的第二次迭代,但在那之后,它似乎只是搞砸了。不知道我做错了什么。

function main() {
  var type = "quicksort"
  var testArray = [9, 6, 5, 0, 8, 2, 4, 7];

  quickSort(testArray, 0, testArray.length - 1);
  for (var i = 0; i < testArray.length; i++) {
    console.log(testArray[i]);
  }

}

function quickSort(array, start, end) {
  var type = "quicksort"
  var pIndex;

  if (start <= end) {
    pIndex = partition(array, start, end);
    quickSort(array, start, pIndex - 1);
    quickSort(array, pIndex + 1, end);
  }


}

function partition(array, start, end) {
  var x = end;
  console.log(start);
  var i = start - 1;
  var temp;

  for (var j = 0; j < end - 1; j++) {
    if (array[j] <= x) {
      i++;
      temp = array[j];
      array[j] = array[i];
      array[i] = temp;
      temp = 0;


    }
  }

  temp = array[i + 1];
  array[i + 1] = array[x];
  array[x] = temp;
  temp = 0;

  return i + 1;
}

main();

【问题讨论】:

  • “搞砸”是什么意思?它做错了什么?
  • 至少更正一次,var x = array[end]。旁注,使用名称end 具有误导性,可能将其更改为last。子数组最后一个元素的典型名称用法是 array[end-1]array[last]

标签: javascript algorithm sorting quicksort


【解决方案1】:

一些错误:

if (start &lt;= end) {start = end的情况不用处理

for (var j = 0 范围从 start 开始时如何以 0 开头?

if (array[j] &lt;= x) {你比较索引和项目值?

【讨论】:

    【解决方案2】:

    错误是

    @function 快速排序

      //if (start <= end)  
      // should be 
      if (start < end) 
    

    @函数分区

    //for (var j = 0; j <= end - 1; j++) {
    // if (array[j] <= x) {
    // Should be
    for (var j = start; j <= end - 1; j++) {
      if (array[j] <= array[x]) {
    

    以下代码应该可以工作。

    function main() {
      var type = "quicksort"
      var testArray = [9, 6, 5, 0, 8, 2, 4, 7];
    
      quickSort(testArray, 0, testArray.length - 1);
      for (var i = 0; i < testArray.length; i++) {
        console.log(testArray[i]);
      }
    
    }
    
    function quickSort(array, start, end) {
      var type = "quicksort";
      var pIndex;
    
      if (start < end) {
        pIndex = partition(array, start, end);
        quickSort(array, start, pIndex - 1);
        quickSort(array, pIndex + 1, end);
      }
    
    
    }
    
    function partition(array, start, end) {
      var x = end;
      console.log(start);
      var i = start - 1;
      var temp;
    
      for (var j = start; j <= end - 1; j++) {
        if (array[j] <= array[x]) {
          i++;
          temp = array[j];
          array[j] = array[i];
          array[i] = temp;
          temp = 0;
        }
      }
    
      temp = array[i + 1];
      array[i + 1] = array[x];
      array[end] = temp;
      temp = 0;
    
      return i + 1;
    }
    
    main();
    

    希望对你有帮助!

    【讨论】:

    • 完美!太感谢了。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2020-08-14
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多