Сортировка по возрастанию, c ++, с векторами - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь сделать функцию сортировки для std::vector, но у меня проблема с отрицательным values.Я не хочу использовать функцию vector::sort.Очередь - это вектор.

Мой ввод:

1, -2, -241, 332, 2667, -2667, 266217, 2667, 13, -22, -41, 2332

Вывод:

266217, 2667, 2667, 2332, 332, 13, 1, -2. -241, -2667, -22, -41

В основном все работает,и тогда это падает из-за неясных причин для меня.

Функция:

void PriorityQueue::Push(double value)
{
    std::vector<double>::iterator pr;

    if (Queue.empty())
    {
        Queue.push_back(value);
    }

    else if (!Queue.empty())
    {
        for (pr = Queue.begin(); pr != Queue.end(); pr++)
        {
            if (value > *pr || value == *pr)
            {
                Queue.insert(pr, value);
                break;
            }

            else if (value < 0)
            {
                if (value > *pr || value == *pr)
                {
                    Queue.insert(pr, value);
                    break;
                }

                else if (value < *pr)
                {
                    Queue.push_back(value);
                    break;
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я вполне уверен, основываясь на подсказках, которые вы дали в ваших комментариях, это то, что вы хотите.Не нужно обрабатывать пустой список или специальные отрицательные числа.И если value не вставляется в цикл for, предполагается, что он находится в конце.

void PriorityQueue::Push(double value)
{
    bool inserted = false;

    for (auto pr = Queue.begin(); pr != Queue.end(); pr++)
    {
        if (value >= *pr)
        {
            Queue.insert(pr, value);
            inserted = true;
            break;
        }
    }
    if (inserted == false) // handle the case of inserting a number at the end
    {
        Queue.push_back(value);
    }
}

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

0 голосов
/ 25 июня 2018
  1. Действительно трудно понять желаемый порядок в этом методе.Но я попробую.Вы используете

    Queue.insert(pr, value);
    

, поэтому я предполагаю, что pr должно быть перед значением в случае, если значение> = * pr.Это означает нисходящий порядок, от макс. До мин.

Вы хотите в порядке убывания.Тогда вам нужна позиция, когда предыдущий был больше или равен, а текущий элемент меньше значения.Поэтому пропускайте все до тех пор, пока эта позиция не будет найдена, а затем вставьте.

void PriorityQueue::Push(double value) {
   std::vector<double>::iterator pr;
   if (Queue.empty()) {
       Queue.push_back(value);
       return;
   }
   for (pr = Queue.begin(); pr != Queue.end(); pr++) {
        if (value < *pr)
            continue;
        Queue.insert(pr,value);
        break;
    }
}

А для возрастания - пропустите все до тех пор, пока не увеличится, а затем вставьте:

    void PriorityQueue::Push(double value) {
       std::vector<double>::iterator pr;
       if (Queue.empty()) {
           Queue.push_back(value);
           return;
       }
       for (pr = Queue.begin(); pr != Queue.end(); pr++) {
            if (value >= *pr)
                continue;
            Queue.insert(pr,value);
            break;
        }
    }

Вам не нужно проверять «если (значение <0)» - я думаю, что ваша логическая ошибка была допущена на этом шаге.Также вам не нужно проверять </p>

if (!Queue.empty())

в операторе else после

if (Queue.empty())

это слишком много проверки и может вызвать много ошибок ...

...