3
對不起,如果這張貼在其他地方(我找不到任何東西,因爲我的問題是比較具體的),但我理解(或至少在理論上)錯誤是什麼;我在如何修復它時遇到了麻煩。代碼應該顯示合併排序的工作方式;代碼運行,但它從來沒有命中函數調用「合併」(下面的代碼,我知道在進口中調用全部是不好的做法,但它不是一個主要項目,所以我不在乎;也許它是隻是預覽,但它被寫入import java.util。;和import java.security。;)。從錯過的函數調用堆棧溢出
import java.util.*;
import java.security.*;
public class Merge {
public static void mergeSort(int[] data) {
sortArray(data, 0, data.length - 1);
}
private static void sortArray(int[] data, int low, int high) {
if ((high - low) >= 1) {
int m1 = low + high;
int m2 = m1 + 1;
System.out.printf("Split: %s\n", subarrayString(data, low, high));
System.out.printf(" %s\n", subarrayString(data, low, m1));
System.out.printf(" %s\n\n", subarrayString(data, m2, high));
sortArray(data, low, m1);
sortArray(data, m2, high);
merge(data, low, m1, m2, high);
}
}
public static void merge(int[] data, int l, int m1, int m2, int r) {
int lIndex = l, rIndex = r, cIndex = l, combined[] = new int[data.length];
System.out.printf("Merge: %s\n", subarrayString(data, l, m1));
System.out.printf(" %s\n", subarrayString(data, m1, r));
while (lIndex <= data[rIndex]) {
if (data[lIndex] <= data[rIndex])
combined[cIndex++] = data[lIndex++];
else
combined[cIndex++] = data[rIndex++];
}
if (lIndex == m2)
while (rIndex <= r) combined[cIndex++] = data[rIndex++];
else
while (lIndex <= m1) combined[cIndex++] = data[rIndex++];
}
private static String subarrayString(int[] data, int low, int high) {
StringBuilder temp = new StringBuilder();
for (int i = 0; i < low; i++)
temp.append(" ");
for (int i = 0; i < high; i++)
temp.append(" " + data[i]);
return temp.toString();
}
public static void main2() {
SecureRandom gen = new SecureRandom();
int[] data = new int[10];
for (int i = 0; i < data.length; i++) data[i] = 10 + gen.nextInt(50);
System.out.printf("\nUnsorted Array:\n%s\n\n", Arrays.toString(data));
mergeSort(data);
System.out.printf("\nSorted Array:\n%s\n\n", Arrays.toString(data));
}
}
讓我知道你是否需要驅動文件。重申,問題是它永遠不會到達合併函數調用並導致堆棧溢出錯誤。
我嘗試這個解決方案,您能解釋一下你的答案給我嗎?我仍然得到同樣的錯誤,似乎沒有改變任何東西... – Astix
你的代碼有錯誤。一個是以上的錯誤。在while循環中還有一個問題,因爲您正在使用right索引處的數據檢查lIndex。 –