Java - 使用字符串合并排序

时间:2013-04-09 11:19:28

标签: java sorting merge mergesort indexoutofboundsexception

在这个程序中,我正在使用mergeSort对奥运奖牌进行排序。

有些东西似乎与我的代码有点关闭,因为有时它会给我一个java.lang.ArrayIndexOutOfBoundsException,有时,它不会。


有一点背景说明:

我有一种随机生成奥运国家的方法,他们的奖牌在记分牌中获胜。以以下形式返回结果的String []数组:

CAN 1 1 1

美国1 1 2

GBR 0 0 1

CHN 0 0 2


然而,记分牌需要组织下降的金牌,银牌和铜牌。所以它必须像:

美国1 1 2

CAN 1 1 1

CHN 0 0 2

GBR 0 0 1

使用bubblesort和quicksort对电路板进行排序可以正常工作,但mergesort没有。有时它会很好,但更常见的是它给我ArrayIndexOutOfBoundsException。

public static void main(String[] args) {    

  Olympic_Results score = new Olympic_Results();

  //print a return value of an array    

  String[] countries = score.OlympicResult(7); //input how many game results
  mergeSort(countries, 0, countries.length - 1);
  for (String value:countries)
  System.out.println(value);
}

public static void mergeSort(String array[], int lo, int n) {
  int low = lo;
  int high = n;
  if (low >= high) {
    return;
  }

  int middle = (low + high) / 2;
  mergeSort(array, low, middle);
  mergeSort(array, middle + 1, high);
  int end_low = middle;
  int start_high = middle + 1;
  while ((lo <= end_low) && (start_high <= high)) {
    if ((array[low].substring(4,8)).compareTo(array[high].substring(4,8)) > 0) {
      low++;
    } 

    else {
      String Temp = array[start_high];
      for (int k = start_high - 1; k >= low; k--) {
        array[k + 1] = array[k];
      }
      array[low] = Temp;
      low++;
      end_low++;
      start_high++;
    }
  }
}  

知道为什么这段代码不能正常工作?谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你将阵列划分为多个部分:

if (low >= high) {
    return;
    }

当长度为1时,尝试停止修复它。

if (high - low <=1) {
    return;
    }

顺便说一句,如果长度是2,那么你可以比较现有的值并返回它们已经立即排序。

<强> UPD

您似乎添加了太多具有相似名称的变量并迷失在其中:)..

这看起来不正确:

while(( lo &lt; = end_low)&amp;&amp;(start_high&lt; = high)){

答案 1 :(得分:0)

两个主要错误:

  1. 您保留两个名称相似但目的不同的变量。因此,while循环测试lo值,尽管从未更改它(循环适用于low变量)。

  2. if内的while应该比较两个已排序系列的初始项目,以选择其中一个。您的系列文字从lowstart_high开始,因此您应该将array[low]array[start_high]进行比较,但请将其与array[high]进行比较。如果array[high]数据恰好是要排序的子区间中的最小值,那么low值将增加超过数组大小(并且while条件不会捕获它,因为它测试lo代替。)