Как получить шаблонную функцию bubbleSort () для отображения отсортированного вектора? - PullRequest
0 голосов
/ 30 марта 2020

Функция bubblesort(), которую я имею для своего вектора, не может вернуть отсортированную версию вектора; бывают случаи, когда если я компилирую и выполняю код в VS, это вызывает ошибку времени выполнения при вызове функции:

Выражение: векторный индекс выходит за пределы диапазона

Я дважды проверил диапазон, и мне кажется, что все в порядке; Я не уверен, в чем проблема: я удостоверился, что вектор был передан по ссылке.

#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>

template <class T>
void fillVector(std::vector<T>& vobj, int n);

template <class T>
void displayVector(std::vector<T>& vobj);

template <class T>
void bubbleSort(std::vector<T>& vobj);
template <class T>
void fillVector(std::vector<T>& vobj, int n)
{
    srand((unsigned int)time(NULL));
    for (int i=0; i<n; ++i)
    {
        vobj.push_back(rand());
    }
}

template <class T>
void displayVector(std::vector<T>& vobj)
{
    const unsigned displayLimit = 10;
    if (vobj.size()>displayLimit)
    {
        for (unsigned i=0; i<displayLimit; ++i)
        {
            std::cout << "  " << vobj[i];
        }
        std::cout << "  ..." << std::endl;
    }
    else
    {
        for (unsigned i = 0; i < vobj.size(); ++i)
        {
            std::cout << vobj[i] << " ";
        }
    }
}
template <class T>
void bubbleSort(std::vector<T>& vobj)
{
    bool swapped = true;
    for (unsigned i=0; swapped && i<vobj.size()-1; ++i)
    {
        swapped = false;
        for (unsigned j=0; j<vobj.size()-1-i; ++j)
        {
            if (vobj[j]>vobj[j++])
            {
                swapped = true;
                std::swap(vobj[j],vobj[j++]);
            }
        }
    }
}

int main()
{
    std::vector<int> vobj;

    std::cout << "Enter # of objects you'd like to store in the vector object: ";
    int n;
    std::cin >> n;
    std::cout << "\n*** Calling fillVector(...) ***" << std::endl;
    fillVector(vobj,n);
    std::cout << "\n*** Calling displayVector(...) ***" << std::endl;
    std::cout << "Vector object contains " << n << " value(s) which are" << std::endl;
    displayVector(vobj);

    std::cout << "\n*** Calling bubbleSort(...) ***" << std::endl;
    bubbleSort(vobj);
    displayVector(vobj);
}

1 Ответ

1 голос
/ 31 марта 2020

В вашей программе bubbleSort вы увеличиваете переменную j в 3 раза! Тебе не кажется, что это в два раза больше?

if (vobj[j]>vobj[j++]) 

должно быть

if (vobj[j]>vobj[j+1]) 

и

std::swap(vobj[j],vobj[j++]); 

должно быть

std::swap(vobj[j],vobj[j+1]); 

Увеличение переменной - это не то же самое, что добавление один к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...