Массив не изменяется после вызова функции сортировки - PullRequest
0 голосов
/ 27 мая 2018

При сортировке вектора с использованием сортировки вставкой массив, который я передал в качестве аргумента, в результате не изменяется.

Я пробовал это раньше и не могу найти свою проблему, будет полезна помощь.

#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;
void insertionSort(vector<int> arr);
int main() {
    vector<int> vec;
    const int arrSize = 5;
    for(int i = 0; i < arrSize; i++) {
        vec.push_back(rand() % 10); // 3 6 7 5 3
    }
    for (auto i : vec) cout << i << endl; // 3 6 7 5 3
    insertionSort(vec);
    for (auto i : vec) cout << i << endl; // 3 6 7 5 3
}

void insertionSort(vector<int> arr) {
    for(int i = 0; i < arr.size() - 1; i++) {
        int j = i + 1;
        while(j > 0 && arr[j - 1] > arr[j]) {
            swap(arr[j - 1], arr[j]);
            j--;
        }
    }
    for (auto i : vec) cout << i << endl; // 3 3 5 6 7
}

1 Ответ

0 голосов
/ 27 мая 2018

Аргументы копируются по значению, если не передана ссылка.Чтобы изменить передаваемый объект, используйте вместо него ссылку.

Передайте vector<int> &arr вместо простого vector<int> arr.Обратите внимание на &.

Другим способом было бы вернуть отсортированный массив и присвоить его старому несортированному массиву.


Некоторые советы:

  1. До rand, позвоните srand, чтобы инициализировать PRNG с начальным числом.Начиная с C ++ 11, есть также <random>, который вы должны отдать предпочтение в любом случае.

  2. std::endl очищает буфер потока.'\n' нет, но имеет тот же визуальный эффект.Favor '\n', если вы действительно не хотите очистить буфер потока.Особенно в циклах, где повторная очистка является излишней и неэффективной.

  3. Используйте соответствующий тип размера для структур данных STL.Для std::vector это std::vector<T>::size_type aka std::size_t.Так же, как для массивов, кстати.Вместо int используйте std::size_t.std::vector::size также возвращает std::size_t, а не int.

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