需要帮助找到arraylist合并排序中的错误

时间:2012-05-06 07:25:30

标签: sorting merge arraylist

我正在尝试为字符串的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++;
   }  
}  

1 个答案:

答案 0 :(得分:1)

问题出在sort函数中。

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

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