C ++ Передача вектора в функцию сортировки фактически не сортирует его

0

У меня есть прототип функции:

void bubbleSort(std::vector<float>);

и реализация:

void bubbleSort(std::vector<float> inputVector)
{
    std::cout << "Executing bubble sort." << std::endl;
    int pass;
    int comparisons;
    float hold;

    for (pass = 1; pass < VECSIZE; pass++)
    {
        for (comparisons = 0; comparisons < VECSIZE - 1; comparisons++)
        {
            if (inputVector[comparisons] > inputVector[VECSIZE + 1])
            {
                hold = inputVector[comparisons];
                inputVector[comparisons] = inputVector[comparisons + 1];
                inputVector[comparisons + 1] = hold;
            }
        }
    }

    for (int i = 0; i < VECSIZE; i+=10)
    {
        std::cout << "Element " << i << " is " << inputVector[i] << std::endl;
    }
    return;
}

Он вызвал из этого main:

#define VECSIZE 1000
int main(void)
{
    std::string fileName = "randFloats.txt";
    std::cout << "Processing " << fileName << "..." << std::endl;
    std::ifstream fileInput(fileName);

    //vector to hold the floats
    std::vector<float> fltVector(VECSIZE);

    if(fileInput.is_open())
    {
        std::string line;
        int i = 0;
        while(getline(fileInput, line))
        {
            fltVector[i] = (::atof(line.c_str()));
            i++;
        }
    }
    bubbleSort(fltVector);
}

В основном, основная функция принимает файл с поплавками длиной 1000 элементов, считывает его в векторную структуру и отправляет его в функцию, подлежащую сортировке. Это было слишком долго, так как я проделал какую-либо работу с указателями на языке, поэтому, когда я bubbleSort std::vector<float> функции bubbleSort, я обнаружил, что он не выводит отсортированный вектор. Как передать вектор функции, чтобы отсортировать ее?

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

Здесь входной файл для тестирования: 1000 строк

  • 0
    Когда вы говорите «вывод», что именно вы имеете в виду?
  • 0
    Запись в консоль.
Показать ещё 3 комментария
Теги:
sorting
vector

3 ответа

5
Лучший ответ

Есть несколько проблем. Некоторые из них:

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

  2. Вы получаете доступ к данным за пределами границ: inputVector[VECSIZE + 1] не существует.

  3. Используйте inputVector.size() вместо использования макроса VECSIZE. В идеале используйте begin(), end() и итераторы.

  4. Нет необходимости в VECSIZE вообще. Просто добавьте вектор в цикл чтения:

    while(getline(fileInput, line)) 
        fltVector.push_back(::atof(line.c_str()));
    
  5. "Прошло слишком много времени, так как я проделал какую-либо работу с указателями на языке" Это C++, вы можете много сделать, даже не касаясь указателя напрямую :)

  • 0
    был Vecsize + 1. Спасибо!
  • 0
    @AaronMcRuer UB - не единственная проблема с вашим алгоритмом сортировки.
Показать ещё 3 комментария
1

Вы передаете вектор в свою функцию по значению:

void bubbleSort(std::vector<float>);

Это означает, что вы сортируете копию вектора, а не фактический вектор. Вам нужно изменить свою подпись функции на

void bubbleSort(std::vector<float>&);
                                  ^ -- note the pass by reference

Другая проблема заключается в том, что вы вызываете Undefined Behavior:

if (inputVector[comparisons] > inputVector[VECSIZE + 1])
                                           ^^^^^^^^^^^ -- accessing an element 2 beyond 

размер вашего массива, и вы не меняете элементы, которые вы сравниваете.

Я думаю, что вы хотели бы сделать:

bool swapped = false;
do
{
    swapped = false;
    for (int j = 0; j < inputVector.size() - 1; ++j)
    {
        if (inputVector[j + 1] > inputVector[j])
        {
            std::swap(inputVector[j + 1], inputVector[j]);
            swapped = true;
        }
    }
} while (swapped);

Обратите внимание на следующие проблемы:

if (inputVector[comparisons] > inputVector[VECSIZE + 1]) // UB
{
    hold = inputVector[comparisons];
    inputVector[comparisons] = inputVector[comparisons + 1]; // not swapping elements you compared!
    inputVector[comparisons + 1] = hold; // same problem as above!
}
0

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

bool swapped = false;
int k = inputVector.size();
do
{
    k--;
    swapped = false;
    for (int j = 0; j < k; j++)
    {
        if (inputVector[j] > inputVector[j + 1])
        {
            std::swap(inputVector[j], inputVector[j + 1]);
            swapped = true;
        }
    }
} while (swapped);
  • 0
    У вас будет UB, когда j == inputVector.size() - 1 .
  • 0
    Обратите внимание, что k-- происходит перед циклом for. Первый экземпляр цикла for будет для (int j = 0; j <... size -1; j ++) {...
Показать ещё 1 комментарий

Ещё вопросы

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