我有一个二维数组,其中许多元素为零。例如:
int array[10][10];
memset(array, 0, 100 * sizeof(int));
array[0][0] = 3;
array[2][8] = 5;
array[4][0] = 4;
如何按降序(或升序)打印非零(仅正数)元素。我在想这样的事情:
int xpos, ypos;
while (getMaximumInArray(array, &xpos, &ypos))
{
printf("x=%i y=%i val=%i\n", xpos, ypos, array[xpos][ypos]);
array[xpos][ypos] = 0; // set to 0 to make sure we find the next biggest value.
}
然而,这使我多次循环遍历数组(只要有非零元素)。有更好的(即更少的操作)方法来做到这一点吗?
编辑:我忘记指定我想在输出中使用这些位置;所以我不仅需要排序后的值;还有他们的指数...
最佳答案
提高效率的一个简单方法是对值进行简单排序。排序(或排序时复制)的运行时复杂度为 O(n log n)
,这比 O(n*n)
有所改进。一种简单有效的方法是将非零值复制到 std::multiset
中,然后迭代它。
有关您的编辑的更新:
没问题。只需存储一个包含集合中的值和索引的对象,并提供一个仅使用该值的比较仿函数。
关于C 按升序或降序打印二维数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018376/