Это мой код сортировки слиянием на языке C.

Как вы можете видеть, закомментированные строки в цикле for функции слияния кода по существу такие же, как и неоткомментированные строки, которые успешно выполняют задачу слияния двух подмассивов.

У меня вопрос - что не так с прокомментированными строками?

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

void merge(int *ar,int p,int q,int r)
{
    int l=r-p+1,*sub1,*sub2,l1=q-p+1,l2=r-q,i,j,k;
    sub1=(int*)malloc(l1*sizeof(int));
    sub2=(int*)malloc(l2*sizeof(int));
    for(i=0;i<l1;i++)
        *(sub1+i)=*(ar+p+i);
    for(i=0;i<l2;i++)
        *(sub2+i)=*(ar+q+i+1);
    i=j=0;
    for(k=0;k<l;k++)
    {
        //if(j=l2||(i!=l1&&(*(sub1+i)<*(sub2+j))))
        //    *(ar+p+k)=*(sub1+i++);
        //else
        //    *(ar+p+k)=*(sub2+j++);
        if(i<l1&&j<l2)
        {
            if(sub1[i]<sub2[j])
             ar[p+k]=sub1[i++];
            else
             ar[p+k]=sub2[j++];
        }
        else if(j<l2)
           ar[p+k]=sub2[j++];
        else
           ar[p+k]=sub1[i++];
    }
}

void mergesort(int *ar,int p,int q)
{
    if(p<q)
    {
        int m=(p+q)/2;
        mergesort(ar,p,m);
        mergesort(ar,m+1,q);
        merge(ar,p,m,q);
        //for(int i=p;i<=q;i++)
        //    printf("%d\t",*(ar+i));
        printf("\n");
    }
}


void main()
{
    int n,i,*ar;
    printf("Enter size of array\n");
    scanf("%d",&n);
    ar=(int*)malloc(n*sizeof(int));
    printf("Enter the elements of the array\n");
    for(i=0;i<n;i++)
        scanf("%d",(ar+i));
    mergesort(ar,0,n-1);
    printf("Sorted array is:\n");
    for(i=0;i<n;i++)
        printf("%d ",*(ar+i));
}

0
Abhishek Saurabh 8 Окт 2019 в 23:42

1 ответ

Лучший ответ

Для закомментированного кода, если j = l1 или sub1 [i]> sub2 [j]. Приведенный ниже код будет работать, но это 3 условия для каждого хода.

    for(k=0;k<l;k++)
    {
        if (i < l1 && (j >= l2 || *(sub1+i)<*(sub2+j)))
            *(ar+p+k)=*(sub1+i++);
        else
            *(ar+p+k)=*(sub2+j++);
    }
0
rcgldr 9 Окт 2019 в 03:16