对这些 n^2 个数字进行排序的最快方法是什么

What is the fastest way to sort these n^2 numbers?

本文关键字:排序 是什么 方法 数字      更新时间:2023-10-16

给定一个数字'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 ++标准库中的排序函数进行过,但我想知道是否可以进一步优化它。

好吧,首先,您获得n^2条目,其中最大的条目将是 n^2 ,并且在可能的值范围内,只有少量值用于大n。因此,我建议采用计数方法:

  1. 用零初始化大小n^2的数组counts[]
  2. 循环访问values[]的值数组,并执行counts[values[i]-1]++
  3. 通过遍历 counts 数组来重新初始化 values 数组,将尽可能多的i+1值拖放到values数组中,counts[i]给出的值。

就这样。它O(n^2),所以你很难找到一个性能更高的解决方案。

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( 解决方案。