带向量的c ++升序排序

时间:2018-06-25 05:54:53

标签: c++ sorting stdvector

我正在尝试为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 :(得分:1)

  1. 用这种方法很难理解所需的顺序。但是我会尝试。您使用

    Queue.insert(pr, value);
    

因此,我假设在大小写值> = * pr时pr应该在值之前。这意味着从最大到最小的降序。

  1. 您要降序排列。然后,当前一个值大于或等于而当前元素小于值时,则需要位置。因此,请跳过所有操作,直到找到该位置,然后再插入。

    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;
        }
    }
  1. 您不需要检查“ if(value <0)”-我认为您的逻辑错误是在此步骤中犯的。另外,您不需要检查

    if (!Queue.empty())
    

    之后的其他声明中

    if (Queue.empty())
    

    这是太多检查,可能会导致许多错误...

答案 1 :(得分:1)

根据您在评论中给出的提示,我很确定,这就是您想要的。不需要对空列表或负数进行特殊处理。如果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);
    }
}

这将可靠地按降序插入元素,而无需特殊处理负数。