Сортировка слиянием, не сортировка самостоятельно созданного массива класса C ++ - PullRequest
0 голосов
/ 16 октября 2018

мой метод сортировки слиянием не работает так, как я хочу, я создал Array Class с некоторыми пользовательскими методами и попытался создать надлежащие компоненты для работы сортировки слиянием.В результате возвращаемая таблица заполняется нулями и случайными числами и заполняется до заполнения памяти.Пожалуйста, если бы Вы могли дать мне несколько советов, что я должен обратить внимание, чтобы исправить это.

также полный класс массива, если вы хотите посмотреть его здесь: https://codeshare.io/5Xnk9Y

Заранее благодарен за любую помощь.

Array Array::merge(Array left, Array right, Array mergedArray)
{   
    int i,j,k,nL,nR;
    i=j=k=0;
    nL = left.GetNumberOfElements();
    nR = right.GetNumberOfElements();
    while(i < nL && j < nR)
    {
        if (left.GetElementWithIndex(i) <= right.GetElementWithIndex(j))
        {   
            mergedArray.SetElementWithIndex(k, left.GetElementWithIndex(i));
            i++;
            k++;
        }else 
        {
            mergedArray.SetElementWithIndex(k, right.GetElementWithIndex(j));
            k++;
            j++;
        }       
    }
    while (i < nL){
        mergedArray.SetElementWithIndex(k,left.GetElementWithIndex(i));

        i++;
        k++;
    }
    while (j < nR){
        mergedArray.SetElementWithIndex(k, right.GetElementWithIndex(j));
        j++;
        k++;
    }
    return mergedArray;
}

Array Array::splitArrayForMergeSort(Array splitedArray)
{
    int length;
    length = splitedArray.GetNumberOfElements();
    if(length < 2) return splitedArray;

    int middle;


    if(length %2 == 1) middle = (length-1)/2;
    else middle = length/2;


    Array left;
    Array right;

    for (int i = 0 ; i < middle ; i++){
        left.AddElement(splitedArray[i]);
    }
    for (int i = middle ; i < length ; i++){
        right.AddElement(splitedArray[i]);
    }

    splitArrayForMergeSort(left);
    splitArrayForMergeSort(right);
    merge(left, right, splitedArray);
}

void Array::MergeSort()
{
    Array arr;
    for (int i = 0 ; i < numberOfElements ; i++){
        arr.AddElement(array[i]);
    }   
    arr = splitArrayForMergeSort(arr);
}

1 Ответ

0 голосов
/ 16 октября 2018

спасибо, я забыл вернуть splitedArray в конце метода splitArrayForMergeSort(), после того, как я его добавил, все работает,

...