void merge(int *a,int p,int q,int r){
int n1 = q - p + 1;
int n2 = r - q;
int* l = malloc((n1+1)*sizeof(int));
int* ri = malloc((n2+1)*sizeof(int));
int i,j;
for(i = 0 ; i < n1 ; i++)
l[i] = a[p+i-1];
for(i = 0 ; i < n2 ; i++)
ri[i] = a[q+i];
Вы пишете элементы из индекса p-1
через индекс q-1
в l
, а элементы из индекса q
через r-1
в ri
. Если p == 0
, вы получаете доступ за пределы.
Вы хотите, однако, отсортировать элементы из индекса p
через r
.
void merge(int *a,int p,int q,int r){
int n1 = q - p + 1;
int n2 = r - q;
int* l = malloc((n1)*sizeof(int));
int* ri = malloc((n2)*sizeof(int));
int i,j;
for(i = 0 ; i < n1 ; i++)
l[i] = a[p+i];
for(i = 0 ; i < n2 ; i++)
ri[i] = a[q+i+1];
Кроме того, вы должны проверить, меньше ли индексы, i
и j
, чем соответствующий конечный индекс n1
resp. n2
, и когда кто-то достигнет конца своей части, скопируйте оставшиеся из другой части в массив. Значительное значение защиты страшно, если массив содержит большие записи.
while(i < n1 && j < n2) {
if (ri[j] < l[i]) {
a[k++] = ri[j++];
} else {
a[k++] = l[i++];
}
}
while(i < n1) {
a[k++] = l[i++];
}
while(j < n2) {
a[k++] = ri[j++];
}