3

このプログラムでは、mergeSort を使用してオリンピック メダルを並べ替えています。

java.lang.ArrayIndexOutOfBoundsException が返されることもあれば、返されないこともあるため、コードに少し問題があるようです。


少し背景を説明するには:

オリンピックの国とそのメダルをスコアボードでランダムに生成する方法があります。結果の String[] 配列を次の形式で返します。

缶 1 1 1

アメリカ 1 1 2

GBR 0 0 1

チャンネル 0 0 2


ただし、スコアボードは、金、銀、銅のメダルを降順で整理する必要があります。したがって、次のようにする必要があります。

アメリカ 1 1 2

缶 1 1 1

チャンネル 0 0 2

GBR 0 0 1

バブルソートとクイックソートを使用してボードをソートするとうまくいきますが、マージソートはうまくいきません。うまくいく場合もありますが、多くの場合、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++;
    }
  }
}  

このコードが正しく動作しない理由がわかりましたか? ありがとうございました!

4

2 に答える 2

0

配列を部分に分割するのが深すぎると思います:

if (low >= high) {
    return;
    }

長さが 1 のときにここで停止して修正を開始してみてください。

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

ところで、長さが 2 の場合は、値をその場で比較して、すぐに並べ替えて返すことができます。

UPD

似たような名前の変数を追加しすぎて、それらに夢中になっているようです:)。

これは正しくありません:

while (( lo <= end_low) && (start_high <= high)) {

于 2013-04-09T11:47:00.037 に答える