Я пытаюсь написать программу сортировки слияния с указателями, и он близок к хорошему функционированию, но есть проблема, что на выходе есть некоторые «0», а не некоторые чисел отсортированного массива.Проблемы с сортировкой слияния с указателями в c
Для тестирования кода вам необходимо написать txt-файл prova.txt
, в котором есть массив, один номер для строки. Например:
prova.txt:
4
7
2
9
1
45
87
При выполнении кода, я ожидаю, что выход
0: 1
1: 2
2: 4
3: 7
4: 9
5: 45
6: 87
, но я получаю
0: 1
1: 0
2: 0
3: 0
4: 0
5: 0
6: 2
Кроме того, есть ли какие-либо советы что вы можете дать мне для улучшения моего кода?
#include <stdio.h>
int *merge(int left[], int right[], int n){
int *ordinato, i=0, j=0;
ordinato = malloc(sizeof(int)*n);
while(i+j < n){
if(left[i] < right[j]){
*(ordinato+i+j) = left[i];
i++;
}else{
*(ordinato+i+j) = right[j];
j++;
}
}
return ordinato;
}
int *mergeSort(int *daOrd, int n){
int k = 0, *left, *right, *ordinato;
ordinato = malloc(sizeof(int)*n);
left = malloc(sizeof(int)*(n/2));
right = malloc(sizeof(int)*(n-(n/2)));
if (n<2){
ordinato = daOrd;
}else{
for(k=0; k<n/2; k++)
*(left + k) = *(daOrd + k);
for(k=n/2; k<n; k++)
*(right + k -(n/2)) = *(daOrd + k);
left = mergeSort(left, n/2);
right = mergeSort(right, n-(n/2));
ordinato = merge(left, right, n);
}
return ordinato;
}
main(){
FILE *input;
input = fopen("prova.txt", "r");
if(!input) printf("Errore");
int tot = 100000;//is the maximum n
int *array;
array = malloc(sizeof(int)*tot);
int indice = 0;
while(fscanf(input,"%d", (array + indice)) != EOF) indice++;
int *ord = mergeSort(array, indice);
int k;
for(k=0; k<indice; k++) printf("%d: %d \n",k, *(ord+k));
getch();
fclose(input);
}
Один совет для удобства чтения: перестаньте писать «классный» код. [Всегда использовать фигурные скобки] (http://programmers.stackexchange.com/questions/16528/single-statement-if-block-braces-or-no) и переименовать 'daOrd' в нечто вроде' array', 'list' , или 'base', и не обфускать' left [k] 'как' * (left + k) '. Кроме того, вам не следует выделять память (вы выделяете 'O (n²)', хотя вам нужно только 'n') и' free' после использования. – phihag
Добро пожаловать в переполнение стека! Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –
благодарим вас за советы. Это был первый или, возможно, второй вопрос на этом сайте, поэтому я не знаю этих правил. Я бы сказал, что я уже использовал отладчик и print-statement, но я убрал их, потому что я итальянский, и они не будут полезны для вас, а код короче. Более того, daOrd - это 2 итальянских слова, для этой мотивации я назвал массив подобным. В следующий раз я должен переименовать перед загрузкой кода здесь? Oli Charlesworth, где я могу найти что-то большее о минимальном тестовом случае? Ваша ссылка предназначена для правил SSCCE ... еще раз спасибо – giacomotb