Java-使用字符串合并排序
在这个程序中,我使用mergeSort对奥运奖牌进行排序 我的代码似乎有点不对劲,因为有时它会给我一个java.lang.ArrayIndexOutOfBoundsException,有时则不会Java-使用字符串合并排序,java,sorting,merge,mergesort,indexoutofboundsexception,Java,Sorting,Merge,Mergesort,Indexoutofboundsexception,在这个程序中,我使用mergeSort对奥运奖牌进行排序 我的代码似乎有点不对劲,因为有时它会给我一个java.lang.ArrayIndexOutOfBoundsException,有时则不会 要了解一些背景说明: 我有一个方法,随机生成奥运会国家和他们在记分板上赢得的奖牌。以以下形式返回结果的字符串[]数组: CAN 1 USA112 GBR 0 0 1 CHN 0 2 然而,记分牌需要由金牌、银牌和铜牌组成。所以它必须是这样的: USA112 CAN 1 CHN 0 2 GBR 0 0
要了解一些背景说明: 我有一个方法,随机生成奥运会国家和他们在记分板上赢得的奖牌。以以下形式返回结果的字符串[]数组: CAN 1 USA112 GBR 0 0 1 CHN 0 2
然而,记分牌需要由金牌、银牌和铜牌组成。所以它必须是这样的: USA112 CAN 1 CHN 0 2 GBR 0 0 1 使用bubblesort和quicksort对电路板进行排序工作正常,但mergesort不行。有时它会很好,但更多时候它会让我产生一种强烈的边界外感觉
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++;
}
}
}
publicstaticvoidmain(字符串[]args){
奥运会成绩得分=新的奥运会成绩();
//打印数组的返回值
String[]countries=score.OlympicResult(7);//输入多少个游戏结果
合并排序(国家,0,countries.length-1);
for(字符串值:国家)
系统输出打印项次(值);
}
公共静态void合并排序(字符串数组[],int-lo,int-n){
int低=低;
int高=n;
如果(低>=高){
返回;
}
int-middle=(低+高)/2;
合并排序(数组、低、中);
合并排序(数组,中间+1,高);
int end_低=中;
int start_high=中间+1;
而((lo=low;k--){
数组[k+1]=数组[k];
}
阵列[低]=温度;
低++;
end_low++;
启动_high++;
}
}
}
知道为什么这段代码不能正常工作吗?谢谢!我觉得你把数组分成几个部分太深了:
if (low >= high) {
return;
}
当长度为1时,尝试在此处停止以开始修复
if (high - low <=1) {
return;
}
if(高-低两个主要错误:
您保留了两个名称相似但用途不同的变量。因此,while
循环测试lo
值,尽管从未更改它(循环使用low
变量)
中的if
while
应该比较两个排序序列的初始项,以选择其中一个。您的序列从低开始
和高开始
,因此您应该将数组[low]
与数组[start\u high]
进行比较,而将其与数组[high]
进行比较。如果数组[高]
数据恰好是被排序的子区间中最小的,那么低
值将增加超过数组大小(并且而条件没有捕获它,因为它测试低
)
堆栈跟踪也指向哪一行?一些旁注:Java中的方法和变量通常是camelCase
。类通常是TitleCase
,没有下划线。为什么要重新发明轮子?为什么要合并排序?最重要的不是排序吗?我会使用Array.sort()@CodeChimp我相信这是堆栈跟踪:线程“main”java.lang.ArrayIndexOutOfBoundsException:9(这个数字每次都会改变)main.mergeSort(main.java:58)main.mergeSort(main.java:54)main.main(main.java:33)@Bohemian我现在正在学习排序算法,所以我必须仔细检查每种算法。