【问题标题】:Sort vector of vector向量的排序向量
【发布时间】:2016-02-28 11:12:18
【问题描述】:

我有一个这样的 int 向量向量:

std::vector<std::vector<int>> vec_vec{{3,5,1,6},{2,4},...};

结果应该是

 Case1:   {{1, 2, 3, 4}, {5, 6}} 
 Case2:  {1,2,3,4,5,6}
 Case3:  {{1, 3, 5, 6}, {2, 4}} 

我找到了很多方法来做到这一点,我发现最好的一种需要复杂性 O(n^2) 来对它们进行排序。

case1case2case3 的最佳复杂度是多少?

那么编写本机 (c++11,c++14) 跨平台代码来对向量进行排序的最佳方法是什么? O(n^2) 是最好的复杂度吗?记忆也很重要。

我检查了这个解决方案here,但似乎还需要O(n^2) 来对向量进行排序?

【问题讨论】:

  • 你认为结果应该是{{1, 2, 3, 4}, {5, 6}}吗?
  • 如果我理解,您想先合并您的向量,然后对合并后的向量进行排序,对吗?合并而不重复?
  • @PaoloM : 或者先对每个向量排序,然后合并
  • 可以插入吗?循环遍历向量并按顺序插入新向量...
  • 什么是n?是向量的个数还是所有向量中值的总数?

标签: c++ algorithm c++11 c++14


【解决方案1】:

最简单的情况是情况 2。为了解决这个问题,制作一个临时的新向量,将所有元素移到那里,并对新向量进行排序。

std::vector<int> temp;
for (const auto& vec: vec_vec)
{
    std::copy(vec.begin(), vec.end(), std::back_inserter(temp));
}
std::sort(temp.begin(), temp.end());

复制部分是O(n);排序部分是 O(n log(n))。

要实现案例 1,将元素从 temp 复制回 vec_vec - 这应该很容易。

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多