我想實現合併排序進行時間分析和測試用於實現此功能時,我得到一些時髦的結果,並找不出原因。我生成了一個20個隨機值的數組,然後調用mergeSort
,然後打印「排序」數組的結果。運行實施合併排序時奇怪的結果
沒有錯誤消息,但結果不是預期的結果。輸出將顯示爲前幾個值的排序,然後是0之間的值,並且最終以非常大的值結束,即使生成的數字應該在1和100之間。輸出如下:
>sort-timings
1 3 8 11 0 14 17 24 0 0 29 96 20 2293400 3 2293400 2293400 26085452 1971496002 1971496002 >Exit code: 0 Time: 0.4162
我已經實現的代碼是:
void merge(int A[], int leftStart, int leftEnd, int rightStart, int rightEnd, int W[]) {
//Merge A[leftStart]....[leftEnd] with A[rightStart]...[rightEnd]
//Into W, indexed by k, copy resulting W into A
int i = leftStart;
int j = rightStart;
int k = leftStart;
while(i <= leftEnd && j <= rightEnd) {
if(A[i] < A[j]) {
W[k++] = A[i++];
}
else if(A[i] > A[j]) {
W[k++] = A[j++];
}
else {
W[k++] = A[i++];
W[k++] = A[j++];
}
}
for(i = leftStart; i <= rightEnd; i++) {
A[i] = W[i];
}
}
void mergeSort(int A[], int low, int high, int W[]) {
//mergeSort Helper Function
if(low == high) {
return; //1 element is sorted
}
int mid = (low + high)/2;
mergeSort(A, low, mid, W); //Sort first half
mergeSort(A, mid + 1, high, W); //Sort second half
merge(A, low, mid, mid + 1, high, W);
return;
}
void mergeSort(int A[], int W[], int n) {
mergeSort(A, 0, n - 1, W);
}
void generateRandomArray(int A[], int n) {
unsigned int seed = time(0);
srand(seed);
for(int i = 0; i < n; i++) {
A[i] = (rand() % 100) + 1; // 1 <= A[i] <=10000
}
}
int main() {
const int ARRAY_SIZE = 20;
int array[ARRAY_SIZE];
int tempArray[ARRAY_SIZE];
generateRandomArray(array, ARRAY_SIZE);
mergeSort(array, tempArray, ARRAY_SIZE);
for(int i = 0; i < ARRAY_SIZE; i++) {
cout << array[i] << " ";
}
}
我認爲這是由while循環內的其他條件來完成,如while循環的條件是一樣的,你所提供的每一個,和其他處理的每個條件爲每個循環你提供了?有區別嗎? – coopwatts
因爲它的AND不是ORd – coopwatts
是的,因爲它是AND,所以當任一條件爲假時,循環將停止。如果你在調試器中自己運行它,並在循環後放置一個斷點,你會發現i或j不會到達最後。 –