пытаясь преобразовать псевдокод в фактически код для MERGE SORT

0

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

/*MERGESORT(A, p, r)]
    if p < r
        q = (p+r)/2
        MERGESORT(A,p,q)
        MERGESORT(A,q + 1, r)
        MERGE(A,p,q,r)

MERGE(A,p,q,r)
    n1 = q - p + 1
    n2 = r - q
    let L[1...n1 + 1] and R[1...n2 + 1] be new arrays
    for i = 1 to n1
        L[i] = A[p + i - 1]
    for j = 1 to n2
        R[j] = A[q + j]
    L[n1 + 1] = INFINITY
    R[n2 + 1] = INFINITY
    i = 1
    j = 1
    for k = p to r
        if L[i] <= R[j]
            A[k] = L[i]
            i = i + 1
        else
            A[k] = R[j]
            j = j + 1*/

Где A - весь массив, pq и r - индексы, а A [p... r] - это то, что нужно сортировать. Это то, что я сделал до сих пор:

    void CensusData::mergeSort(int type) {
        if(type == 0) //STOPPED FOR DEBUGGING
            MERGE_SORT(type, 0, data.size() - 1);
    }

    void CensusData::MERGE_SORT(int type, int p, int r){
        //int q;
        //cout << "data size " << data.size() << endl;
        std::cout << "MERGE_SORT START ///("<< p << ", " << r << ")" <<std::endl;
        if(p < r)
        {
            int q = (p + r)/2;
            MERGE_SORT(type, p, q);
            MERGE_SORT(type, q + 1, r);
            MERGE(type, p, q ,r);
        }
    }

    void CensusData::MERGE(int type, int p, int q, int r){
        if(type == 0)
        {
            std::cout << "MERGING WITH: (" << p << ", "<< q <<", " << r<< ")"<< std::endl;
            //int n1;
            //int n2;
            int n1 = q - p + 1;
            int n2 = r - q;
            cout << "N1: " << n1 <<" N2:" << n2 << endl;
            Record* L[n1 + 1];
            Record* R[n2 + 1];
            L[n1 + 1] = NULL;
            R[n2 + 1] = NULL;
            for(int i = 0; i < n1; i++)
            {
                if (L[i] == NULL)
                    continue;
                cout << "P, I: " << p <<", "<< i<< endl;
                cout << "filling array L: " << data[p + i]->population << endl;
                L[i] = data[p + i];
                cout<< L[i]->population << endl;
            }
            //cout << "J: " << j << endl;
            for(int j = 0; j < n2; j++)
            {
                if(R[j] == NULL)
                    continue;
                cout << "filling array R: " << data[q + j + 1]->population<<endl;
                R[j] = data[q + j + 1];
                cout << R[j]->population << endl;
            }

            int i = 0;
            int j = 0;
            for(int k = p; k <= r; k++)
            {
                if(L[i]->population < R[j]->population)
                {
                    cout << "TRUE" << endl;
                    data[k] = L[i];
                    i = i + 1;
                }
                else
                {
                    cout << "FALSE" << endl;
                    data[k] = R[j];
                    j = j + 1;
                }
            }
               std::vector<Record*>::iterator it = data.begin();
   while (it != data.end()) {
      std::cout << *(*it)->city << ", "
                << *(*it)->state << ", "
                << (*it)->population << std::endl;
        }
    }

Все, что я могу вам сказать, это то, что он не работает, и он неисправен во всех местах, я работал над ним в течение 6 часов и ничего не делал, помощь была бы оценена. NOte: запись - это вектор, который также называется данными. Здесь также ввод и вывод:

Vina, California, 237
San Francisco, California, 812826
Santa Fe, New Mexico, 68642
Roseville, California, 1293
New York, New York, 283822
Potatoville, Brentland , 283822

вывод:

Vina, California, 237
Santa Fe, New Mexico, 68642

Program received signal SIGSEGV, Segmentation fault.
0x00445dd7 in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
    at /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/iostream:77
77        static ios_base::Init __ioinit;
Теги:
mergesort

3 ответа

0

Помимо домашней работы вам могут быть интересны алгоритмы сортировки RosettaCode/Merge sort/C++.

0

Помимо ваших проблем с индексацией вне границ, в чем смысл

if (L[i] == NULL) 
    continue; 

в инициализации?

Если массив был инициализирован с помощью NULL, а это не так, вы пропустили бы каждый элемент, что кажется немного бессмысленным, и если хотя бы один элемент имеет значение NULL, что может произойти случайно, вы, скорее всего, потерпите крах в следующий цикл, когда вы говорите

L[i]->population

Между прочим, последний цикл никогда не заканчивается.

0

Вот одна проблема, которую я вижу:

    Record* L[n1 + 1];
    Record* R[n2 + 1];
    L[n1 + 1] = NULL;
    R[n2 + 1] = NULL;

Вы определяете массив из x элементов, а затем вы пытаетесь установить значение для элемента x + 1. Помните, что массивы индексируются от 0 до n-1.

  • 0
    принимая к сведению, я также несколько раз обновлял свой вопрос, если вы не заметили ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню