MergeSort - исправить код - C (СИ)
Формулировка задачи:
Доброго времени суток!
Коротко о проблеме. После ознакомления с кодом в Вики и на различных форумах я склепал свой. Но ошыбки мне починить не удалось Я создаю массив, инициализирую его и делаю процедуру mergesort(). Первый аргумент ето входной массив, за ним идет отсортированый, далее левая и правая граница. Собственно проблема в нем Помогите пожалуста!
Скрин консоли после вывода массива:
Исправил код.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void mergesort (int*, int*, int, int);
void main ()
{
int* input;
int* output = (int*) calloc (11 , sizeof(int));
int i;
int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
input = mas;
mergesort (input, output, 0, 9);
for (i = 0; i < 10; i++)
{
printf ("%d ", output[i]);
printf ("%d \n", input[i]);
}
_getch();
}
void mergesort (int* input, int* output, int left, int right)
{
if (right - left < 1)
return;
else
{
int i;
int l, r;
int mid = (left + right) / 2;
mergesort (input, output, left, mid);
mergesort (input, output, mid + 1, right);
// mergesort();
l = left;
r = mid + 1;
/*for (i = left; i < right; i++)
{
/*if (r <= right || (l <= mid && input[l] <= input[r]))
output[i] = input[l++];
else
output[i] = input[r++];*/
i = left;
int k;
while ((l <= mid) && (r <= right))
{
if (input[l] <= input[r])
output[i++] = input[l++];
else
output[i++] = input[r++];
}
if (l > mid)
for (k = r; k <= right; k++)
output[i++] = input[k++];
else for (k = l; k <= mid; k++)
output[i++] = input[k++];
for (k = left; k < right; k++)
input[k] = output[k];
// }
}
}
Апдейт.
Немного изменил код и вот что из етого получилось.
Первый этап обработки исключения в "0x0028160f" в "diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0x001e0000".
Необработанное исключение в "0x777415ee" в "diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0x001e0000".
Программа "[4176] diskret.exe: Машинный код" завершилась с кодом -1073741819 (0xc0000005).
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void mergesort (int*, int*, int, int);
void main ()
{
int* input;
int* output = (int*) calloc (11 , sizeof(int));
int i;
int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
input = mas;
mergesort (input, output, 0, 9);
for (i = 0; i < 10; i++)
{
printf ("%d ", output[i]);
printf ("%d \n", input[i]);
}
_getch();
}
void mergesort (int* input, int* output, int left, int right)
{
if (right - left < 1)
return;
else
{
int i;
int l, r;
int mid = (left + right) / 2;
mergesort (input, output, left, mid);
mergesort (input, output, mid + 1, right);
// mergesort();
l = left;
r = mid + 1;
for (i = left; i < right; i++)
{
if ((l < mid + 1 && r > right) || input[l] <= input[r])
output[i] = input[l++];
else
output[i] = input[r++];
i = left;
int k;
/*while ((l <= mid) && (r <= right))
{
if (input[l] <= input[r])
output[i++] = input[l++];
else
output[i++] = input[r++];
}
if (l > mid)
for (k = r; k <= right; k++)
output[i++] = input[k++];
else for (k = l; k <= mid; k++)
output[i++] = input[k++];*/
for (k = left; k < right; k++)
input[k] = output[k];
}
}
}#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void mergesort (int*, int*, int, int);
void main ()
{
int* input;
int* output = (int*) calloc (11 , sizeof(int));
int i;
int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
input = mas;
mergesort (input, output, 0, 9);
for (i = 0; i < 10; i++)
{
printf ("%d ", output[i]);
printf ("%d \n", input[i]);
}
_getch();
}
void mergesort (int* input, int* output, int left, int right)
{
if (right - left < 1)
return;
else
{
int i;
int l, r;
int mid = (left + right) / 2;
mergesort (input, output, left, mid);
mergesort (input, output, mid + 1, right);
// mergesort();
l = left;
r = mid + 1;
/* for (i = left; i < right; i++)
{
if ((l < mid + 1 && r > right) || input[l] <= input[r])
{
output[i] = input[l];
l++;
}
else
{
output[i] = input[r];
r++;
}*/
i = left;
int k;
while ((l <= mid) && (r <= right))
{
if (input[l] <= input[r])
{
output[i++] = input[l];
l++;
}
else
{
output[i++] = input[r++];
r++;
}
}
if (l > mid)
for (k = r; k <= right; k++)
output[i++] = input[k];
else for (k = l; k <= mid; k++)
output[i++] = input[k];
for (k = left; k < right; k++)
input[k] = output[k];
}
}Решение задачи: «MergeSort - исправить код»
textual
Листинг программы
/* ANSI C 99 */
#include <stdio.h>
#include <string.h>
void dump(const int * arr, size_t count) {
while ( count-- )
printf("%d%c", *arr++, ( count ) ? ' ' : '\n');
}
void merge(const int * arrA, size_t cntA, const int * arrB, size_t cntB, int * arrC) {
if ( cntA ) {
if ( cntB ) {
if ( *arrB < *arrA ) {
*arrC++ = *arrB++;
--cntB;
}
else {
*arrC++ = *arrA++;
--cntA;
}
merge(arrA, cntA, arrB, cntB, arrC);
}
else {
while ( cntA-- )
*arrC++ = *arrA++;
}
}
else {
while ( cntB-- )
*arrC++ = *arrB++;
}
}
int * merge_sort(int * arr, size_t count) {
if ( count > 1 ) {
int buf[count];
merge(merge_sort(arr, count / 2), count / 2, merge_sort(arr + count / 2, count - count / 2), count - count / 2, buf);
return memcpy(arr, buf, sizeof(int) * count);
}
else
return arr;
}
#define COUNT (10)
int main(void) {
int arr[COUNT] = { 5, 3, 8, 0, 7, 9, 1, 2, 6, 4 };
printf("Unsorted:\n");
dump(arr, COUNT);
printf("Sorted:\n");
dump(merge_sort(arr, COUNT), COUNT);
return 0;
}
Объяснение кода листинга программы
Код реализует алгоритм сортировки Merge Sort.
- В функции
dumpпроисходит вывод массива на экран. Принимает указатель на массив и количество элементов в массиве. Использует форматированный вывод для отделения элементов друг от друга пробелами или переносом строки в зависимости от количества оставшихся элементов. - В функции
mergeпроисходит слияние двух отсортированных массивов в один. Принимает указатель на первый массив, количество элементов в первом массиве, указатель на второй массив, количество элементов во втором массиве и указатель на результирующий массив. Если в массивах остаются элементы, то рекурсивно вызывается функцияmergeдля сортировки этих элементов. Если один из массивов пуст, то все оставшиеся элементы копируются в результирующий массив. - В функции
merge_sortпроисходит сортировка массива с помощью алгоритмаMerge Sort. Принимает указатель на массив и количество элементов в массиве. Если количество элементов больше 1, то массив разбивается на две равные части, каждая из которых сортируется рекурсивно, затем эти части объединяются с помощью функцииmerge. Если количество элементов равно 1, то возвращается сам массив. - В функции
mainсоздаётся тестовый массив, выводится его исходное состояние, затем вызывается функцияmerge_sortдля сортировки массива и выводится отсортированный массив.