【问题标题】:Need help finding bug in arraylist merge sort需要帮助查找 arraylist 合并排序中的错误
【发布时间】:2012-05-15 04:24:14
【问题描述】:

我正在尝试为字符串的arraylists 实现合并排序算法,但我似乎找不到导致arraylist 排序的错误。

private static void sort(java.util.ArrayList<String> a)
{

   // End recursion
   if (a.size() < 2)
   {
      return;
   }


   int mid = a.size() / 2;


   java.util.ArrayList<String> left = new java.util.ArrayList<String>();


   int i;

   for (i = 0; i < mid; i++)
   {

      left.add(a.remove(i));

   }


   java.util.ArrayList<String> right = new java.util.ArrayList<String>();

   // Copy the second half to the "right"
   for ( ; i < a.size(); i++)
   {
      right.add(a.remove(i));
   }


   sort(left);
   sort(right);

   merge(a, left, right);
}

private static void merge(java.util.ArrayList<String> result, java.util.ArrayList<String> left,java.util.ArrayList<String> right)
{
   int i, l, r;

   i = l = r = 0;


   while (l < left.size() && r < right.size())
   {
      if ((left.get(l)).compareTo(right.get(r)) < 0)
      {
         result.add(left.get(l));
         l++;
      }
      else
      {
         result.add(right.get(r));
         r++;
      }

      i++;
   }


   while (l < left.size())
   {
      result.add(left.get(l));
      l++;
      i++;
   }

   // Append rest of the values in the right half, if any...
   while (r < right.size())
   {
      result.add(right.get(r));
      r++;
      i++;
   }  
}  

【问题讨论】:

  • 它看起来像家庭作业,你没有告诉我们你尝试了什么或问题是什么......
  • 其实我告诉过你问题是什么,如果你读了我的声明。我说“似乎找不到破坏数组列表排序的错误。”换句话说,数组列表没有正确排序。它是一个字符串数组列表,因此显然字符串不是按字母顺序排列的。另外我敢打赌,你说这看起来像是每张新海报的功课。不管怎样,你想让我告诉你什么我已经尝试过?告诉我我尝试了什么是毫无用处的,因为我是一个相对较新的程序员,很多都是完全错误的。
  • 因为要对字符串数组进行排序,所以可以使用 Collections.sort 或简单地将字符串放入 TreeSet 中,如果删除重复项是明智的,除非分配说要实现合并排序或那里是推出自己的排序的一个很好的理由。你没有提到的。
  • 公平地说,我应该提到我这样做是出于教育目的。我知道我可以只使用 java 标准库,但我试图完全理解合并排序背后的逻辑。学习它的最好方法是自己实现它。
  • 当然。那么问题是什么?返回的输入列表是不变的,还是只是部分排序的?你试图找到什么问题?它是否适用于某些输入?是否返回所有输入元素?

标签: sorting merge arraylist


【解决方案1】:

问题出在sort 函数中。

当您使用 a.remove(i) 时会发生什么?索引i 处的元素被从数组中删除,因此先前位于索引i+1 的元素现在位于索引i,并且数组大小递减。如果您随后执行i++,然后再次执行a.remove(i),您将跳过数组中的一个元素。

在您的sort 函数中,当调用merge 时,您应该检查a.size() == 0。你会发现情况并非总是如此。 merge 函数看起来不错,但是您的数组拆分不正确:您忘记了使用 remove(int i) 会更改数组;它的大小和元素的索引。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2016-05-25
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多