排序这些n ^ 2数字的最快方法是什么?

时间:2017-03-23 11:57:08

标签: c++ algorithm sorting

给定一个数字' n',我想返回一个包含所有k1 * k2值的n ^ 2个数字的排序数组,其中k1和k2的范围可以从1到n。

例如,对于n = 2,它将返回:{1,2,2,4}。(该数字基本上是1 * 1,1 * 2,2 * 1,2 * 2)。

并且对于n = 3,它将返回:{1,2,2,3,3,4,6,6,9}。

(数字为:1 * 1,2 * 1,1 * 2,2 * 2,3 * 1,1 * 3,3 * 2,2 * 3,3 * 3)

我尝试使用c ++标准库中的sort函数,但我想知道它是否可以进一步优化。

2 个答案:

答案 0 :(得分:4)

首先,您获得n^2个条目,其中最大的条目为n^2,并且在可能的值范围内,只有少量值用于大n }}。所以,我建议采用计数方法:

  1. 使用零初始化大小为counts[]的数组n^2
  2. 遍历您的数组values[],然后执行counts[values[i]-1]++
  3. 通过遍历values数组重新初始化counts数组,将i+1的{​​{1}}值放入values数组,counts[i]给出。< / LI>

    这就是全部。这是O(n^2),所以你几乎找不到更高效的解决方案。

答案 1 :(得分:3)

vector<int> count(n*n+1);
for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
        ++count[i*j];
for (int i = 1; i <= n*n; ++i)
    for (int j = 0; j < count[i]; ++j)
        cout << i << " ";

这实际上是cmaster答案中描述的O(n * n)解决方案。