【发布时间】:2014-03-20 15:21:27
【问题描述】:
我的 MergeSort 代码没有读取右侧。 我认为问题一定出在 MergeSort 的递归上。如果我把正确的部分: MergeSort(S,(q+1),last);在另一个递归之前,它没有读取左侧。这是我的代码:
first = 0;
last = S.length;
// START - MergeSort
public static int[] MergeSort(int[] S,int first,int last){
if(first<last){
int q = (first+last)/2;
MergeSort(S,first,q);
MergeSort(S,(q+1),last);
Merge(S,first,q,(q+1),last);
}
return S;
}
public static void Merge(int[] S,int first1,int last1,int first2,int last2){
int N = last1 - first1 + 1;
int M = last2 - first2 + 1;
int Total = N+M-1;
int[] A = new int[N];
int[] B = new int[M];
int[] C = new int[Total];
int posA=0;
int posB=0;
int posC=0;
for(int i=first1; i<N; i++){
A[i] = S[i];
}
for(int i=first2; i<M; i++){
B[i] = S[i];
}
while(posA<N && posB<M){
if(A[posA]<B[posB]){
C[posC]=A[posA];
posA++;
posC++;
}
else{
C[posC]=B[posB];
posB++;
posC++;
}
}
// IF ANYTHING LEFT!
if(posA==N && posB<M){
for(int i=posC;i<Total;i++){
C[i]=B[posB];
posB++;
}
}
if(posB==M && posA<N){
for(int i=posC;i<Total;i++){
C[i]=A[posA];
posA++;
}
}
// DONE!
【问题讨论】:
-
所有代码请使用Java naming conventions。方法应该在
camelCase。不遵守这些约定会使我们更难阅读您的代码(并且还会弄乱语法突出显示)。 -
您的预期输出是什么?因为我刚刚运行了带有输出的示例,并且它肯定在方法中运行了第二个
MergeSort()? -
我给它一个数组,例如 (3,2,5,6,1),它将 3 与 0 进行比较。然后将 3,2 与 0 进行比较。第二部分 (5,6, 1)一切都是0。它将0与0进行比较,然后将0与0进行比较...已编辑!最后输出 0,0,1,5,6 所以一部分没了。
-
也许我对这个问题的回答 (stackoverflow.com/questions/21771119/…) 可以帮助您调试代码
标签: java sorting recursion mergesort