Попытка отсортировать список чисел в C ++ - PullRequest
2 голосов
/ 20 февраля 2020

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

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

Вот функция:

void sort(std::list<int>& numbers)
{
    list<int>::iterator it;
    list<int>::iterator it2;
    for (it = numbers.begin(); it != numbers.end(); ++it)
    {
        for (it2 = ++numbers.begin(); it2 != numbers.end(); ++it2)
        {
            if (*it > *it2)
            {
                int temp = *it;
                *it = *it2;
                *it2 = temp;
            }
        }
    }
}

1 Ответ

3 голосов
/ 20 февраля 2020

Ваш алгоритм не работал, потому что второй цикл всегда go повторяет (почти) весь список снова и снова. Что он должен сделать, это только go через оставшуюся часть. Т.е. второй цикл должен быть:

for (it2 = std::next(it1); it2 != numbers.end(); ++it2)

Также, поскольку второй цикл начинается со «следующего» элемента, первый цикл должен go не до последнего элемента, а до второго до последнего элемента. Т.е. что-то вроде этого:

for (it = numbers.begin(); it != std::prev(numbers.end()); ++it)

НО, поскольку std::prev() определено только для двунаправленных итераторов, а std::list не предоставляет один, его, вероятно, проще переписать как:

for (it = numbers.begin(); std::next(it) != numbers.end(); ++it)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...