在这个程序中,我正在使用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++;
}
}
}
知道为什么这段代码不能正常工作?谢谢!
答案 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)
两个主要错误:
您保留两个名称相似但目的不同的变量。因此,while
循环测试lo
值,尽管从未更改它(循环适用于low
变量)。
if
内的while
应该比较两个已排序系列的初始项目,以选择其中一个。您的系列文字从low
和start_high
开始,因此您应该将array[low]
与array[start_high]
进行比较,但请将其与array[high]
进行比较。如果array[high]
数据恰好是要排序的子区间中的最小值,那么low
值将增加超过数组大小(并且while
条件不会捕获它,因为它测试lo
代替。)