Java 合并排序问题
所以有一点背景: 我们的老师基本上坐下来用Java实现了SQL,你可以说。他告诉我们尝试在他制作的系统中实现一个合并算法 我试图做一个合并排序自上而下的实现,但我有几个问题 合并排序应该从他创建的数据库实现中提取两个模拟表,并对它们进行排列,以便它们以升序1-8从最低到最高显示 代码允许我使用我们老师编写的DB迭代器来迭代表及其内容。因此,我们有两个表,其中包含以下数据:Java 合并排序问题,java,mergesort,Java,Mergesort,所以有一点背景: 我们的老师基本上坐下来用Java实现了SQL,你可以说。他告诉我们尝试在他制作的系统中实现一个合并算法 我试图做一个合并排序自上而下的实现,但我有几个问题 合并排序应该从他创建的数据库实现中提取两个模拟表,并对它们进行排列,以便它们以升序1-8从最低到最高显示 代码允许我使用我们老师编写的DB迭代器来迭代表及其内容。因此,我们有两个表,其中包含以下数据: [hello1, 5] [hello2, 6] [hello3, 7] [hello4, 8] 另一张表: [goodby
[hello1, 5]
[hello2, 6]
[hello3, 7]
[hello4, 8]
另一张表:
[goodbye4, 4]
[goodbye2, 2]
[goodbye3, 3]
[goodbye1, 1]
合并排序后,应该打印出以下内容:
[goodbye1, 1]
[goodbye2, 2]
[goodbye3, 3]
[goodbye4, 4]
[hello1, 5]
[hello2, 6]
[hello3, 7]
[hello4, 8]
但这是它打印出来的:
null
[hello1, 5]
[hello2, 6]
[hello3, 7]
我对此有点困惑,并试图调试以找出哪里出了问题,但我可能尝试了太多,以至于对实际问题视而不见。下面是对最后三种方法进行排序的代码:
public String[] MergeSort(String table1, String table2) {
DbIterator scannerA = getTableScanner(table1);
DbIterator scannerB = getTableScanner(table2);
HashMap<Integer, String> records = new HashMap<>();
ArrayList<Integer> A = new ArrayList<>();
ArrayList<Integer> B = new ArrayList<>();
int n = 0;
scannerA.open();
while(scannerA.hasNext()) {
Record r = scannerA.next();
StringField sF = (StringField) r.getField(0);
IntegerField iF = (IntegerField) r.getField(1);
records.put(iF.hashCode(), sF.toString());
A.add(iF.hashCode());
n++;
}
scannerA.close();
scannerB.open();
while(scannerB.hasNext()) {
Record r = scannerB.next();
StringField sF = (StringField) r.getField(0);
IntegerField iF = (IntegerField) r.getField(1);
records.put(iF.hashCode(), sF.toString());
B.add(iF.hashCode());
n++;
}
scannerB.close();
int[] mergeResult;
int[] aA = convertIntegers(A);
int[] bB = convertIntegers(B);
mergeResult = TopDownSplitMerge(aA, 0, n, bB);
String[] results = new String[mergeResult.length];
for(int v = 0; v < mergeResult.length; v++) {
if(records.containsKey(v)) {
results[v] = "[" + records.get(v) + ", " + v +"]";
}
}
return results;
}
private int[] CopyArray(int[] B, int iBegin, int iEnd, int[] A) {
for(int k = iBegin; k < iEnd; k++)
A[k] = B[k];
return A;
}
private int[] TopDownSplitMerge(int[]A,int iBegin, int iEnd, int[]B) {
if(iEnd - iBegin < 2) {
return null;
}
int iMiddle = (iEnd + iBegin) / 2;
TopDownSplitMerge(A, iBegin, iMiddle, B);
TopDownSplitMerge(A, iMiddle, iEnd, B);
TopDownMerge(A, iBegin, iMiddle, iEnd, B);
int[] tmp = CopyArray(B, iBegin, iEnd, A);
return tmp;
}
public void TopDownMerge(int[] A, int iBegin, int iMiddle, int iEnd, int[] B) {
int i0 = iBegin;
int i1 = iMiddle;
for(int j = iBegin; j < iEnd; j++) {
if(i0 < iMiddle && (i1 >= iEnd || A[i0] <= A[i1])) {
B[j] = A[i0++];
} else {
B[j] = A[i1++];
}
}
}
首先,这不是我个人的算法,而是我试图在wiki上实现它。我唯一搞不清楚的部分,可能会一起解决整个问题,就是他们所说的iEnd。价值n。我不知道该如何计算,或者给出什么值。可能真的是整个问题。Read TopDownMerge–将数组中两个排序部分的项合并到B的相应部分,然后CopyArray将合并的数据复制回A。因此B只是合并数据的临时缓冲区,而不是数据源。您不应该使用两个输入数组aA和bB调用TopDownSplitMerge,而是将它们连接到一个数组中,并将该数组用作参数,将另一个数组用作B缓冲区