我是新來的算法,我一直在嘗試合併排序工作,但它不會給出正確的輸出。沒有編譯錯誤,但我想它只是在某處出現了缺陷,在輸出中顯示隨機值作爲排序數組。無法在C++中實現合併排序
void merge_sort(int[], int, int);
void merge(int[], int, int, int);
void printarray(int[], int);
int main() {
int Arr[100], num_of_elements;
cout << "Enter the number of elements (max 100): ";
cin >> num_of_elements;
cout << "Enter array elements: \n";
for (int i = 0;i < num_of_elements;++i)
cin >> Arr[i];
merge_sort(Arr, 0, num_of_elements - 1);
cout << "\nAfter Sorting (by Merge Sort):\n";
printarray(Arr, num_of_elements);
cout << endl;
return 0;
}
void merge_sort(int arr[], int left, int right) {
if (left < right) {
int mid = (left + right)/2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
void merge(int arr[], int left, int mid, int right) {
int i, j, k;
/* Calculate the lengths of the subarrays and copy the elements into them */
int lenght_left = mid - left + 1;
int length_right = right - mid;
int *leftarray = new int[lenght_left];
int *rightarray = new int[length_right];
for (i = 0;i < lenght_left;++i)
leftarray[i] = arr[left + i];
for (j = 0;j < length_right;++j)
rightarray[j] = arr[mid + 1 + j];
/* Reordering the elements in the original array */
for (k = left, i = 0, j = 0;k <= right;++k) {
if (leftarray[i] <= rightarray[j])
arr[k] = leftarray[i++];
else
arr[k] = rightarray[j++];
}
/* Copy remaining elements into the array */
while (i < lenght_left)
arr[k] = leftarray[i++];
while (j < length_right)
arr[k] = rightarray[j++];
delete[](leftarray);
delete[](rightarray);
}
void printarray(int arr[], int num) {
cout << "Displaying Elements in array: \n";
for (int i = 0;i < num;i++)
cout << arr[i] << " ";
}
創建當[最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)是很重要的以實際使其*完整*,並顯示如何使用您的功能,以及您傳遞給他們的輸入以及預期的和實際的輸出。另請[請閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –
解決這些問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –
你在輸出中顯示隨機值作爲排序後的數組是什麼意思?你的意思是說數組根本沒有被排序,得到部分排序或者被垃圾數據填滿了嗎?如果是最後一個,那麼你在某處存在內存問題(=>調試器)。你還可以向我們展示合併排序函數的調用(包括如何初始化數組並將其傳遞給函數)? – rbaleksandar