簡體   English   中英

升序排序,c ++,帶向量

[英]Ascending sort, c++, with vectors

我試圖做一個排序函數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;
                }
            }
        }
    }
}
  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()) 

    在else語句之后

     if (Queue.empty()) 

    這是太多的檢查,可能會導致許多錯誤......

我相當肯定,根據您在評論中提供的提示,這就是您想要的。 它不需要處理空列表或負數特殊。 如果沒有在for循環中插入value ,則假定它在最后。

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);
    }
}

這將可靠地按降序順序插入元素,而無需特殊處理負數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM