Merge Sort в C компилируется, но не сортируется - PullRequest
0 голосов
/ 06 февраля 2011

Я сделал эту программу для сортировки массива.Это работает хорошо, но это не будет сортировать!Пожалуйста, помогите мне найти ошибку в моей логике.Спасибо

[ОБНОВЛЕНИЕ] Он смог работать!Я просто сбил i, j и k, как предложено ниже. Также из i

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

void mergesort(int[], int, int);
void merge(int [], int low, int mid, int hi); //function prototype

int main()
{
    int arr[]={1,4,78,92,9};
    mergesort(arr,0,5);
    //after mergesort
    for(int i=0; i<5; i++)
    {
        printf("%d, ", arr[i]);
    }
    system("pause");
    return 0;
}

void mergesort(int aptr[], int low, int hi)
{
    int mid =0;
    int rightmax=0;
    int leftmax=0;

    if(low==hi)
    {
        return;
    }
    mid=(low+hi)/2;
    mergesort(aptr, low, mid);
    mergesort(aptr, mid+1, hi);
    merge(aptr, low, mid, hi);
}

void merge(int aptr[], int low, int mid, int hi)
{
    int j, i, k;

    //copy contents of aptr to auxiliary b 
    for(i=low; i<=hi; i++)
    {
        bptr[i]=aptr[i]; 
    }

    // iterate through b as if they were still two arrays, lower and higher
    //copy smaller elements first
    i=low;
    j=mid+1;
    k=low;

    while(i<= mid && j<=hi)
    {
        if(bptr[i]<=bptr[j])//<--put smaller element first
        {
            aptr[k++]=bptr[i++];
        }
        else
        {
            aptr[k++]=bptr[j++];
        }
    } 
    // copy back first half just in case
    while(i<=mid)
    {
        aptr[k++]=bptr[i++];
    }
   }//function

Ответы [ 3 ]

2 голосов
/ 06 февраля 2011

Оператор i<= mid && j<=hi никогда не верен, когда ваша программа выполняется, следовательно, зависящий от него цикл while никогда не вводится, и ваш код, который фактически меняет элементы, никогда не достигается.

После предшествующего ему цикла for, i равно hi, что всегда больше mid. Я предполагаю, что вы хотите сбросить i равным low перед тем, как войти в этот цикл while.

1 голос
/ 06 февраля 2011

Вот предложение о том, как начать: помещайте вызовы printf () в функции mergesort () и merge (), которые отображают параметры в начале и в конце каждого вызова функции. Это может помочь вам понять, что происходит. Попросить других людей отладить ваш алгоритм не поможет вам научиться программировать.

0 голосов
/ 06 февраля 2011

В качестве дополнительной точки я хотел бы отметить, что вы стали жертвой ошибки возможного целочисленного переполнения:

mid=(low+hi)/2;

Если low и / или hi достаточно велики, low + hi переполнится, и вы получите неправильное значение для mid.Вместо этого вы должны сделать это:

mid = low + (hi - low) / 2;
...