Сортировка слиянием работает некорректно - C (СИ)
Формулировка задачи:
Здравствуйте! Читаю Алгоритмы. Построение и анализ. Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Попытался реализовать на си, но не верно. Помогите, пожалуйста!
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define COUNT 9 void merge(int *arr, int p, int q, int r) { int i,j,k; int n1 = q - p; int n2 = r - q; int *larr = malloc(sizeof(int)*(n1+1)); int *rarr = malloc(sizeof(int)*(n2+1)); for( i = 0; i < n1; i++ ) larr[i] = arr[p+i]; for( j = 0; j < n2; j++ ) rarr[j] = arr[q+j]; larr[n1] = 999999; rarr[n2] = 999999; i = 0; j = 0; for( k = p; k < r; k++ ) { if( larr[i] <= rarr[j] && i < n1 ) arr[k] = larr[i++]; else arr[k] = rarr[j++]; } free(larr); free(rarr); } void merge_sort( int *arr, int p, int r ) { if( p < r ) { int q = (p+r)/2; merge_sort( arr, p, q ); merge_sort( arr, q+1, r); merge(arr,p,q,r); } } int main( int argc, char ** argv ) { int i,j; int array[COUNT]; // заполнение случайными числами srand(time(NULL)); for( i = 0; i < COUNT; i++ ) array[i] = rand()%255; // вывод массива перед сортировкой for( i = 0; i < COUNT; i++ ) printf("%d ", array[i]); // сортировка merge_sort( array, 0, COUNT ); // вывод массива после сортировки printf("%c",'\n'); for( i = 0; i < COUNT; i++ ) printf("%d ", array[i]); return EXIT_SUCCESS; }
Решение задачи: «Сортировка слиянием работает некорректно»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define COUNT 9 void merge(int *arr, int p, int q, int r) { int i,j,k; int n1 = q - p; int n2 = r - q; int *larr,*rarr; if(n1==0 || n2==0) return; larr = (int*)malloc(sizeof(int)*n1); rarr = (int*)malloc(sizeof(int)*n2); for( i = 0; i < n1; i++ ) larr[i] = arr[p+i]; for( j = 0; j < n2; j++ ) rarr[j] = arr[q+j]; i = 0; j = 0; for( k = p; k < r; k++ ) { if(j==n2 || ( i < n1 && larr[i] <= rarr[j]) ) arr[k] = larr[i++]; else arr[k] = rarr[j++]; } free(larr); free(rarr); } void merge_sort( int *arr, int p, int r ) { int q; if( r-p > 1 ) { q = (p+r)/2; merge_sort( arr, p, q ); merge_sort( arr, q, r); merge(arr,p,q,r); } } int main( int argc, char ** argv ) { int i; int array[COUNT]; // заполнение случайными числами srand((unsigned)time(NULL)); for( i = 0; i < COUNT; i++ ) array[i] = rand()%255; // вывод массива перед сортировкой for( i = 0; i < COUNT; i++ ) printf("%d ", array[i]); // сортировка merge_sort( array, 0, COUNT ); // вывод массива после сортировки printf("\n"); for( i = 0; i < COUNT; i++ ) printf("%d ", array[i]); return EXIT_SUCCESS; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем функцию
merge
, которая будет выполнять слияние массивов - В функции
merge
определяем переменныеi
,j
,k
для работы с индексами массива - Определяем переменные
n1
иn2
для хранения размеров сортируемых массивов - Выделяем память под массивы
larr
иrarr
с помощью функцииmalloc
- Копируем элементы из исходного массива в
larr
иrarr
- Создаем временный массив
arr
для хранения отсортированных значений - Сортируем элементы массива с помощью цикла
for
и условного оператораif
- Освобождаем память, выделенную под
larr
иrarr
- Объявляем функцию
merge_sort
, которая будет выполнять сортировку массива слиянием - В функции
merge_sort
определяем переменнуюq
для хранения индекса серединного элемента - Проверяем условие для рекурсивного вызова функции
merge_sort
- Рекурсивно вызываем функцию
merge_sort
для левой и правой половин массива - Рекурсивно вызываем функцию
merge_sort
для правой и левой половин массива - Вызываем функцию
merge
для слияния отсортированных половин массива - В функции
main
создаем массивarray
типаint
с длиной 9 - Заполняем массив случайными числами с помощью функции
rand
иsrand
- Выводим массив на экран с помощью цикла
for
и функцииprintf
- Вызываем функцию
merge_sort
для сортировки массиваarray
- Выводим отсортированный массив на экран с помощью цикла
for
и функцииprintf
- Возвращаем успешный результат выполнения программы с помощью
return EXIT_SUCCESS
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д