我一直在爲我的作業程序性編程類爲我們提供的合併排序程序不能完全運作。它對具有偶數個整數的數組執行合併排序,但會拋出奇數個整數的分段錯誤。C:合併排序具有不規則數量元素的數組
我理解排序是如何工作的,並且由於奇數導致分段錯誤,因爲數組正在被過度填充。我也明白,解決方案將涉及測試原始數組是否爲偶數,然後根據此值將值傳遞給合併函數。儘管我對程序瞭解得很清楚,但爲了讓這個工作正常進行,我幾個星期來一直把頭靠在牆上,我希望有人能給我一些建議。
在發佈之前,我已經做了很多四處尋找答案,但所有其他示例都涉及合併排序程序和結構,這超出了我迄今爲止學到的內容。你會看到我在下面發佈的代碼。此外,完整的程序還涉及其他一些文件,但我只包含mergesort.c
文件和merge.c
文件,正如我教授所保證的那樣,文件是唯一需要做出任何更改的地方。 main
文件完美工作,只負責填充陣列並調用mergesort
函數。如果其他文件是必要的,讓我知道,我會張貼它們。我沒有的唯一原因是因爲我們使用的是Linux shell,而且我還沒有找到將代碼從shell複製並粘貼到我自己的操作系統的實用方法,並且需要一段時間才能寫出來。
在此先感謝您提供的任何指針。這是代碼。
mergesort.c
#include <"mergesort.h">
void mergesort(int key[], int n) //key is the array, n is the size of key
{
int j, k, m, *w;
w = calloc(n, sizeof(int));
assert(w != NULL);
for (k = 1; k < n; k *= 2) {
for (j = 0; j < n - k; j += 2 * k) {
merge(key + j, key + j + k, w + j, k, k);
}
for (j = 0; j < n; ++j) {
key[j] = w[j];
}
}
free(w);
}
merge.c
#include "mergesort.h"
void merge(int a[], int b[], int c[], int m, int n) {
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (a[i] < b[j]) {
c[k++] = a[i++];
} else {
c[k++] = b[j++];
}
}
while (i < m) {
c[k++] = a[i++];
}
while (j < n) {
c[k++] = b[j++];
}
}
你確定它的工作原理爲**所有陣列均勻** ** ??我有這種感覺,它只適用於大小爲2 –
的大小的數組,並且還允許在代碼中更改哪些內容?你可以例如重寫整個mergesort函數嗎? –
抱歉,延遲。我能夠改變任何東西,但教練已經通知我,只需要在mergesort.c文件中進行更改。另外,是的,你是正確的。它僅以2的冪次排序數組。我的錯。 – TheStyxCrossing