Сортировка слиянием: необходимость копирования элементов из временного массива

Я пытался анализировать сортировку слиянием, но столкнулся со странной ошибкой. это мой код:

int merge(int *a,int st,int mid,int en)
{
    int i,j,l,m;
    i = st;
    l = st;
    m = mid + 1;
    while((l<=mid) && (m <= en))
    {
        if(a[l] <= a[m])
        {
            temp[i] = a[l];
            l++;
            i++;
        }
        else
        {
            temp[i] = a[m];
            m++;
            i++;
        }
    }
    if(l <= mid)
    {
        for(j=l;j<=mid;j++)
        {
            temp[i] = a[j];
            i++;
        }
    }
    else 
    {
        for(j=m;j<=en;j++)
        {
            temp[i] = a[j];
            i++;
        }
    }
    for(j=st;j<=en;j++) // ??
        a[j] = temp[j];  // ??
}

void mergesort(int *a,int st,int en)
{
    int mid;
    if(st<en)
    {
        mid = (st+en)/2;
        mergesort(a,st,mid);
        mergesort(a,mid+1,en);
        merge(a,st,mid,en);
    }
}

int main()
{
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    mergesort(a,0,n-1);
    for(i=0;i<n;i++)
        printf("%d\n",temp[i]);
    getch();
    return 0;
}

Я использую типичный код сортировки слиянием. Я столкнулся с проблемой, чтобы понять, почему необходимо копировать содержимое из временного массива в основной массив, чтобы получить правильный вывод. Я попробовал это на следующем вводе: 5 (количество терминов) ,
4 4 5 3 2

И я получаю вывод как: 3 2 4 4 5 без копирования содержимого из временного массива в основной массив, и если я делаю копирование с использованием «закомментированного» цикла, вывод в порядке, т.е. 2 3 4 4 5. Я просто не получается, почему так происходит?


person Himanshu Kansal    schedule 06.01.2014    source источник
comment
Поймите функцию слияния (и то, как она здесь используется: рекурсия), и вы получите ответ.   -  person Rafed Nole    schedule 06.01.2014


Ответы (1)


Копия необходима, поскольку копирование выполняется в функции слияния, а не в функции сортировки слиянием. Функция слияния должна вызываться снова и снова рекурсивно; поэтому временный массив будет продолжать меняться.

Вам нужно поместить частично отсортированную часть исходного массива в исходный массив при каждом вызове сортировки слиянием. Эта частично отсортированная часть на самом деле является временным массивом.

person Rafed Nole    schedule 06.01.2014