【问题标题】:Java - Merge sort with StringsJava - 使用字符串合并排序
【发布时间】:2013-03-31 19:05:39
【问题描述】:

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

我的代码似乎有点不对劲,因为有时它会给我一个 java.lang.ArrayIndexOutOfBoundsException ,有时它不会。


一些背景说明:

我有一种方法可以在记分牌中随机生成奥运国家及其获得的奖牌。以如下形式返回一个 String[] 结果数组:

CAN 1 1 1

美国 1 1 2

GBR 0 0 1

中国 0 0 2


但是,记分牌需要按照金牌、银牌和铜牌的递减顺序排列。所以它必须是这样的:

美国 1 1 2

CAN 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++;
    }
  }
}  

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

【问题讨论】:

  • 堆栈跟踪也指向哪一行?
  • 一些侧面cmets:Java中的方法和变量通常是camelCase。类通常是TitleCase,不带下划线。
  • 为什么要重新发明轮子?为什么要合并排序?最重要的不就是排序了吗?我会使用 Array.sort()。
  • @CodeChimp 我相信这是堆栈跟踪:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 9(这个数字每次都会改变)在 main.mergeSort(main.java:58) at main.mergeSort(main.java:54) 在 main.main(main.java:33)
  • @Bohemian 我现在正在学习排序算法,所以我必须通过每个算法。

标签: java sorting merge mergesort indexoutofboundsexception


【解决方案1】:

两个主要错误:

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

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

【讨论】:

    【解决方案2】:

    我认为您在将数组划分为多个部分方面过于深入:

    if (low >= high) {
        return;
        }
    

    尝试在长度为 1 时停止并开始修复它。

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

    顺便说一句,如果长度为 2,那么您可以比较适当的值并立即返回它们已经排序。

    UPD

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

    这看起来不正确:

    while ((lo

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 2013-06-04
      • 1970-01-01
      • 2012-11-29
      • 2012-05-01
      • 1970-01-01
      相关资源
      最近更新 更多