【问题标题】:Why am I not reaching the base case in my pivot sorting algorithm?为什么我的数据透视排序算法没有达到基本情况?
【发布时间】:2012-10-30 00:35:49
【问题描述】:

我在尝试为链表构建排序算法时遇到堆栈溢出异常。在那里,我的排序无限期地卡在同一个支点上,我无法弄清楚为什么它没有达到基本情况。

//Intlist 是一个简单的单链表类,带有一个 int var ".item" 和一个 .next 指针

 pivotS(Intlist thisList){
    if (thisList == null || thisList.next == null){
      return thisList;
    } else{
      int pivot = thisList.item;
      Intlist lower = lowerThanPivot(pivot, thisList);
      Intlist upper = greaterOrEqualPivot(pivot, thisList);
      lower = pivotS(lower);
      upper = pivotS(upper);
      return appendLists(lower, upper);
    }
  }

这应该类似于构造中的合并排序,对吗?我的个人功能似乎工作正常。我只是设置了递归错误吗?

【问题讨论】:

  • 返回类型在哪里。
  • 你能发布 lowerThanPivot() 或 greaterOrEqualPivot() 吗?我认为这是迭代列表的问题(也许你通过不重置迭代器或其他东西来跳过元素),据我所知,迭代器是内置在实际的列表类中的,你从来没有提到.next 和 .item 以外的任何方法
  • 这会找到 .item 严格低于枢轴的成员。 public static Intlist lowerThanPivot(int n, Intlist L){ if (L == null){ return L; } else if (L.item >= n){ return lowerThanPivot(n, L.next); } else{ return new Intlist(L.item, lowerThanPivot(n, L.next)); } }
  • 我正在使用一个 lowerThanPivot 版本。 PivotS 是静态的并返回 Intlist。

标签: java sorting linked-list pivot


【解决方案1】:

假设您有一个由数字 137 的两个副本组成的列表,让我们看看这个算法会做什么。

首先,您会查看第一个元素并注意到它存在(它不为空)并且列表不只有一个元素(下一个指针也不为空)。然后将第一项拆分为枢轴,因此枢轴为 137。

现在,看看接下来会发生什么。 lower 列表由小于主元的所有元素组成,在本例中为空列表。 upper 列表由大于或等于主元的所有元素组成,在本例中,主元是 137 的两个副本。然后在两个列表上递归调用 pivotS。但是,这里有一个问题 - upper 列表等于您需要排序的原始列表,因此递归的进行方式与以前完全相同。这最终会导致堆栈溢出。

要解决此问题,请更新您的代码以将输入列表分成 三个 组 - 小于基准的元素、等于基准的元素和大于基准的元素。这可能看起来像这样:

pivotS(Intlist thisList){
    if (thisList == null || thisList.next == null){
      return thisList;
    } else{
      int pivot = thisList.item;
      Intlist lower = lowerThanPivot(pivot, thisList);
      Intlist equal = equalToPivot(pivot, thisList);
      Intlist upper = greaterThanPivot(pivot, thisList);
      return appendLists(appendLists(pivotS(lower), equal), pivotS(upper);
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多