Сортировка слиянием работает некорректно - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Объявляем функцию merge, которая будет выполнять слияние массивов
  3. В функции merge определяем переменные i, j, k для работы с индексами массива
  4. Определяем переменные n1 и n2 для хранения размеров сортируемых массивов
  5. Выделяем память под массивы larr и rarr с помощью функции malloc
  6. Копируем элементы из исходного массива в larr и rarr
  7. Создаем временный массив arr для хранения отсортированных значений
  8. Сортируем элементы массива с помощью цикла for и условного оператора if
  9. Освобождаем память, выделенную под larr и rarr
  10. Объявляем функцию merge_sort, которая будет выполнять сортировку массива слиянием
  11. В функции merge_sort определяем переменную q для хранения индекса серединного элемента
  12. Проверяем условие для рекурсивного вызова функции merge_sort
  13. Рекурсивно вызываем функцию merge_sort для левой и правой половин массива
  14. Рекурсивно вызываем функцию merge_sort для правой и левой половин массива
  15. Вызываем функцию merge для слияния отсортированных половин массива
  16. В функции main создаем массив array типа int с длиной 9
  17. Заполняем массив случайными числами с помощью функции rand и srand
  18. Выводим массив на экран с помощью цикла for и функции printf
  19. Вызываем функцию merge_sort для сортировки массива array
  20. Выводим отсортированный массив на экран с помощью цикла for и функции printf
  21. Возвращаем успешный результат выполнения программы с помощью return EXIT_SUCCESS

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы