我一直在嘗試實現合併排序;但實現方式不正確 - 輸出包含的值不是原始數組的一部分。我試着將它與其他人的實現(工作)進行比較,但似乎無法找到錯誤。合併排序實現不按預期工作
的代碼是: -
#include <iostream>
using namespace std;
void Merge (int A[], int lo, int hi, int mid){
int i = lo;
int k = 0;
int j = mid+1;
int R[hi-lo];
while(i<=mid && j<=hi){
if(A[i]<A[j]){
R[k]=A[i];
cout << A[i] << "; " << A[j] << " " << i << " " << j << endl;
i++;
}else {
R[k]=A[j];
cout << A[i] << "; " << A[j] << " " << i << " " << j << endl;
j++;
}k++;
}
while(i<=lo){
R[k]=R[i];
i++;k++;
}
while(j<=hi){
R[k]=R[j];
j++;k++;
}
int count =0;
for(i=lo; i<hi; i++){
A[i]=R[count];
count++;
cout << count << " ; " << i << "-/-/-/-/-/-/-" << flush;
}
}
void mergeSort(int A[], int lo, int hi){
//if(hi-lo+1<2)return;
if (lo<hi){
int mid = (lo+hi)/2;
mergeSort(A, lo, mid);
mergeSort(A, mid+1, hi);
Merge (A, lo, hi, mid);}
}
int main(){
int A[] = {1,5,3,4,8,9,150,7,51,65};
int hi = sizeof(A)/sizeof(int);
cout << hi << endl;
mergeSort(A,0, hi);
cout << endl << endl << endl << endl;
for(int i=0; i<=hi; i++){
cout<<A[i]<< "; " << flush;
}
return 0;
}
我試圖尋找類似Q(S),但是沒能找到。
*我已經試過了比較的implentation(工作)等人*的 - 你應該調試版本,而不是試圖通過線找到 - 你有什麼差異。其次,'int R [hi-lo];'是無效的C++,因爲C++中的數組只能使用常量表達式聲明來表示條目數。 – PaulMcKenzie
只是一個猜測,但是'R'數組(忽略聲明的非法性)看起來可能太小;如果'hi'是源數組的有效索引,'R'的大小應該是'hi-lo + 1'。按照目前的寫法,它比源數組少一個元素。 –
@PeteBecker首先感謝回覆。現在,即使在宣佈R合法後(並未知道aboutConstaFactor)並更正其長度(hi-lo + 1),輸出仍然保持不變。 – vibster