Я работал над назначением для моего класса Процессное программирование, где нам предоставляется программа сортировки слияния, которая не работает полностью. Он выполняет сортировку слияния на массивах с четным числом целых чисел, но вызывает ошибку сегментации с нечетным числом целых чисел.C: Merge-Сорт массива с неравномерным количеством элементов
Я понимаю, как работает сортировка, и что возникает ошибка сегментации, поскольку нечетное число вызывает ошибку сегментации, потому что массив как-то переполнен. Я также понимаю, что решение будет включать проверку того, является ли исходный массив четным или нечетным, а затем передавать значения функции слияния по-разному в зависимости от этого. Несмотря на то, что я действительно понимаю о программе, я несколько недель стучал головой о стену, пытаясь заставить ее работать правильно, и я надеюсь, что кто-то может дать мне несколько советов.
Я пробовал ответы на вопросы, прежде чем публиковать их, но все остальные примеры включают в себя программы сортировки слияния с структурами, которые находятся за пределами того, что я узнал до сих пор. Вы увидите в коде, который я публикую ниже. Кроме того, полная программа включает в себя несколько других файлов, но я включил только файл mergesort.c
и файл merge.c
, который, как я был уверен моим профессором, - это единственные места, которые необходимо внести. Файл main
отлично работает и отвечает только за заполнение массива и вызов функции mergesort
. Если нужны другие файлы, дайте мне знать, и я опубликую их. Единственная причина, по которой у меня нет, это то, что мы используем оболочку Linux, и я не нашел практического способа скопировать и вставить код из оболочки в свою собственную операционную систему, и для ее выписки требуется некоторое время.
Заранее благодарим за любые указатели, которые вы можете предоставить. Вот код.
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. Кроме того, да, вы правы. Он сортирует массивы только с мощностью двух. Виноват. – TheStyxCrossing