Программа сортировки слиянием не сортирует массив с более чем 5 элементами - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь реализовать код для сортировки слиянием. Я использую следующий код для сортировки слиянием, которую вы можете посмотреть на здесь . Проблема в том, что когда я запускаю программу, например, я просил ее отсортировать массив [1, 2, 3, 4, 6, 5], а затем распечатать отсортированный массив, он возвращает массив [-1560047667 1 2 3 4 5]. Из того, что я заметил, он не будет правильно печатать значение самого большого элемента в массиве. Мой код ниже:

#include<stdio.h>
#include<stdlib.h>

void merge_sort(int A[], int start, int end){
    My code for merge sort 
    goes here
}

int main(){
    int n, i, *A;
    A = (int *)malloc(n);
    scanf("%d", &n);
    for(i=0; i<n; i++) scanf("%d", A+i);
    merge_sort(A, 0, n);
    for(i=0; i<n; i++) printf("%d", *(A+i));
}

Любое предложение о том, какую ошибку я совершил? Я думаю, что проблема в процессе ввода / вывода, но не совсем уверен, что именно.

1 Ответ

0 голосов
/ 15 января 2019

Ваш код пытается развить психические силы. Вы используете n до того, как ему будет присвоено значение, как вы используете scanf впоследствии, чтобы узнать, каким должно быть n. Это приведет к неопределенному поведению, так как ваш код будет работать только при наличии менее 5 элементов.

int n, i, *A;
A = (int *)malloc(n);
scanf("%d", &n);

Вы также не выделяете достаточно памяти, поскольку это будет выделять n байтов, где как int обычно будет 4 байта (или больше или меньше в зависимости от архитектуры вашего компьютера). Лучший способ гарантировать, что вы выделите правильный объем памяти, - это умножить n на sizeof(*A) - это размер того, на что указывает A. Это гарантирует, что если вы измените A на другой тип, код распределения останется правильным.

scanf("%d", &n);
A = malloc(n*sizeof(*A));
...