Си. Двухпутевое слияние. В чем ошибка?
В чем ошибка?Почему возвращается огромное значение и программа завершается досрочно?Выдает Segmentation fault , как это исправить?Или ошибка в самой сортировке?Подскажите пожалуйста.Заранее благодарю.
и сразу спрошу..как вычислять временную сложность такой сортировки?Как сравнения считать, вроде понятно..Но обмены ведь мы не совершаем..т.е. считать действия, когда мы переписываем элементы в массив "c"?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void merge(int *a, int n){
int mid = n / 2;
if (n % 2 == 1)
mid++;
int *c = (int*)malloc(n * sizeof(int));
int i = 0; int j = mid ; int k = 0;
while(i<mid && j<=n){
if (a[i]>a[j]){
c[k]=a[j];
j++;
k++;
}
else if (a[j]>a[i]){
c[k]=a[i];
i++;
k++;
}
else {
c[k]=a[i];
c[k+1]=a[j];
k=k+2;
i++;
j++;
}
}
if (i<mid){
while (i<mid){
c[k] = a[i];
i++; k++;
}
}
if (i<=n){
while(i<=n){
c[k] = a[j];
j++; k++;
}
}
}
void arrprint(int *arr, int n) {
printf("%d", *arr);
int i;
for ( i = 1; i < n; i++) printf(" %d", arr[i]);
puts("");
}
int main(int argc, char *argv[]) {
int n = 10;
int *arr;
arr = malloc(n * sizeof *arr);
srand(time(NULL));
int s;
for ( s = 0; s < n; s++) {
arr[s] = rand() % 50;
}
arrprint(arr, n);
merge(arr, n);
arrprint(arr, n);
free(arr);
puts("");
return 0;
}
Ответы (1 шт):
Во-первых, n-го элемента же в массиве нет, поэтому к нему обращаться нельзя.
Во-вторых, массив-приёмник c[] никак не используется
В третьих. это не сортировка, а только слияние двух частей массива, и должны быть заданы границы этих частей, например merge(int *a, int n, int mid)
Сам код слияния может выглядеть так:
while(i<mid && j<n){
if (a[i]<=a[j])
c[k++]=a[i++];
else
c[k++]=a[j++];
}
while (i<mid)
c[k++] = a[i++];
while (j<n)
c[k++] = a[j++];
Вот сортировка (там стоит подправить сравнение if (a[pos1] <= a[pos2]))