2012-12-11 138 views
2

我想在Java中使用合并排序来对数组进行排序。在这种情况下,数组是numBars。我制作了一个由30个数字组成的小数组,并附加了控制台的输出。我跟踪合并方法,看看为什么我会遇到索引问题。我相信我在某个地方的位置是1,但似乎无法弄清楚我的逻辑在哪里干扰。Java使用合并排序对数组进行排序

public void mergeSort() { 
     mergeSortHelper(numBars, 0); 
     System.out.println(Arrays.toString(numBars)); 
    } 

    public void mergeSortHelper(int[] theArray, int leftIndex) { 

     //split the list in half 
     int mid = theArray.length/2; 
     if (mid < 1) { 
      return; 
     } else { 
      System.out.println("Left Index is originally: " + leftIndex); 
      int[] left = Arrays.copyOfRange(theArray, 0, mid); 
      int[] right = Arrays.copyOfRange(theArray, mid, theArray.length); 
      //sort the lower half 
      mergeSortHelper(left, leftIndex); 
      mergeSortHelper(right, leftIndex + left.length); 
      //merge them together 
      merge(left, right, leftIndex); 
      System.out.println("Left Index is now: " + leftIndex); 
      System.out.println("Right Index is now: " + (leftIndex + mid)); 
      System.out.println(Arrays.toString(numBars)); 
      left = Arrays.copyOfRange(numBars, leftIndex, leftIndex + mid); 
      right = Arrays.copyOfRange(numBars, leftIndex + mid, leftIndex + mid + right.length); 
     } 
    } 

    public void merge(int[]a, int[]b, int leftIndex) { 
     int i = 0; 
     int j = 0; 
     int result = leftIndex; 
     while (i < a.length && j < b.length) { 
      //System.out.println("Comparing from A: " + a[i] + " Comparing from B: " + b[i]); 
      if (a[i] < b[j]) { 
       theCanvas.wait(theDelay); 
       theCanvas.eraseRectangle(graphWidth + i * barWidth, graphHeight - barScale * numBars[i], barScale, barScale * numBars[i]); 
       numBars[result] = a[i]; 
       result++; 
       theCanvas.fillRectangle(graphWidth + i * barWidth, graphHeight - barScale * numBars[i], barScale, barScale * numBars[i]); 
       i++; 
      } else { 
       theCanvas.wait(theDelay); 
       theCanvas.eraseRectangle(graphWidth + j * barWidth, graphHeight - barScale * numBars[j], barScale, barScale * numBars[j]); 
       numBars[result] = b[j]; 
       result++; 
       theCanvas.fillRectangle(graphWidth + j * barWidth, graphHeight - barScale * numBars[j], barScale, barScale * numBars[j]); 
       j++; 

      } 
      //System.out.println("First Loop, Comparing Size" + Arrays.toString(output)); 
     } 
     while (i < a.length) { 
      numBars[result] = a[i]; 
      result++; 
      i++; 
      //System.out.println("Second Loop, Finishing A array" + Arrays.toString(output)); 
     } 

     while(j < b.length) { 
      numBars[result] = b[j]; 
      result++; 
      j++; 
      //System.out.println("Third Loop, Finishing B array" + Arrays.toString(output)); 
     } 
     //System.out.println(Arrays.toString(output)); 
    } 

控制台输出:

Left Index is originally: 0 
Left Index is originally: 0 
Left Index is originally: 0 
Left Index is originally: 1 
Left Index is now: 1 
Right Index is now: 2 
[10, 50, 55, 99, 18, 9, 46, 80, 37, 35, 69, 77, 34, 53, 53] 
Left Index is now: 0 
Right Index is now: 1 
[10, 55, 50, 99, 18, 9, 46, 80, 37, 35, 69, 77, 34, 53, 53] 
Left Index is originally: 3 
Left Index is originally: 3 
Left Index is now: 3 
Right Index is now: 4 
[10, 55, 50, 18, 99, 9, 46, 80, 37, 35, 69, 77, 34, 53, 53] 
Left Index is originally: 5 
Left Index is now: 5 
Right Index is now: 6 
[10, 55, 50, 18, 99, 9, 46, 80, 37, 35, 69, 77, 34, 53, 53] 
Left Index is now: 3 
Right Index is now: 5 
[10, 55, 50, 9, 46, 99, 18, 80, 37, 35, 69, 77, 34, 53, 53] 
Left Index is now: 0 
Right Index is now: 3 
[10, 55, 50, 99, 18, 9, 46, 80, 37, 35, 69, 77, 34, 53, 53] 
Left Index is originally: 7 
Left Index is originally: 7 
Left Index is originally: 7 
Left Index is now: 7 
Right Index is now: 8 
[10, 55, 50, 99, 18, 9, 46, 37, 80, 35, 69, 77, 34, 53, 53] 
Left Index is originally: 9 
Left Index is now: 9 
Right Index is now: 10 
[10, 55, 50, 99, 18, 9, 46, 37, 80, 35, 69, 77, 34, 53, 53] 
Left Index is now: 7 
Right Index is now: 9 
[10, 55, 50, 99, 18, 9, 46, 35, 69, 80, 37, 77, 34, 53, 53] 
Left Index is originally: 11 
Left Index is originally: 11 
Left Index is now: 11 
Right Index is now: 12 
[10, 55, 50, 99, 18, 9, 46, 35, 69, 80, 37, 34, 77, 53, 53] 
Left Index is originally: 13 
Left Index is now: 13 
Right Index is now: 14 
[10, 55, 50, 99, 18, 9, 46, 35, 69, 80, 37, 34, 77, 53, 53] 
Left Index is now: 11 
Right Index is now: 13 
[10, 55, 50, 99, 18, 9, 46, 35, 69, 80, 37, 53, 53, 77, 34] 
Left Index is now: 7 
Right Index is now: 11 
[10, 55, 50, 99, 18, 9, 46, 77, 34, 53, 53, 80, 37, 35, 69] 
Left Index is now: 0 
Right Index is now: 7 
[10, 55, 50, 80, 37, 35, 69, 77, 34, 53, 53, 99, 18, 9, 46] 
[10, 55, 50, 80, 37, 35, 69, 77, 34, 53, 53, 99, 18, 9, 46] 

任何帮助将不胜感激!谢谢!

+0

如果您告诉我们哪一行抛出了异常,这会更容易。 – madth3

+0

@ madth3问题是,它没有抛出异常。这是发生了什么,在一个合并排序中,原始数组numBars被递归地分割成左右数组,然后左和右被放回到numBars中,这最后一部分将它放回到numBars中,解决所有问题。 – Vikram

+0

你可以发布你的主要方法吗?此外,只是一个好奇心,但名称“numBars”背后的含义是什么? – The111

回答

2
} else { 
    System.out.println("Left Index is originally: " + leftIndex); 
    int[] left = Arrays.copyOfRange(theArray, 0, mid); 
    int[] right = Arrays.copyOfRange(theArray, mid, theArray.length); 
    //sort the lower half 
    mergeSortHelper(left, leftIndex); 
    mergeSortHelper(right, leftIndex + left.length); 
    //merge them together 
    merge(left, right, leftIndex); 
    System.out.println("Left Index is now: " + leftIndex); 
    System.out.println("Right Index is now: " + (leftIndex + mid)); 
    System.out.println(Arrays.toString(numBars)); 
    left = Arrays.copyOfRange(numBars, leftIndex, leftIndex + mid); 
    right = Arrays.copyOfRange(numBars, leftIndex + mid, leftIndex + mid + right.length); 
} 

最后,当您复制numBars值到leftright,那是完全没有意义的,因为这些走出去的范围随即,将进行垃圾回收。

在调用者中,应该排序的数组保持不变。您需要将合并的值从numBars复制到作为参数的数组theArray中,以便在调用方合并时合并排序后的数组。

因此,与

for(int i = 0; i < mid; ++i) { 
    theArray[i] = numBars[leftIndex + i]; 
} 
for(int i = mid; i < mid + left.length; ++i) { 
    theArray[i] = numBars[leftIndex + i]; 
} 

替换else块中的最后两行复制的合并结果到相同的对象呼叫者通过。

但是,如果您将合并结果作为参数传递给merge的参数传递给它,那么它会导致更简洁的代码。

+0

耶正确指出如此....合并子数组后,你不会将它们返回为已排序的数组。 – Fyre