我有一个2D数组,其中许多元素为零。例如:
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.
}
然而,这使得我多次遍历数组(与非零元素一样多)。是否会有更好的(即减少操作)方式来做到这一点?
编辑:我忘了指定我想使用输出中的位置;所以我不仅需要排序的值;还有他们的指数...
答案 0 :(得分:1)
您可以创建新数组然后对其进行排序。 例如:
int array[10][10];
array[0][0] = 3;
array[2][8] = 5;
array[4][0] = 4;
int positive[100];
int k = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(array[i][j] > 0){
positive[k++] = array[i][j];
}
}
}
sort(positive, positive + k);
for(int i = 0; i < k; i++){
printf("%d", positive[i]);
}
答案 1 :(得分:1)
提高效率的一种简单方法是简单地对值进行排序。排序 - 或排序时复制 - 运行时复杂度为O(n log n)
,这比O(n*n)
有所改进。一种简单有效的方法是将非零值复制到std::multiset
,然后迭代它。
有关您的修改的更新:
没问题。只需存储一个包含集合中的值和索引的对象,并提供仅使用该值的比较函子。
答案 2 :(得分:0)
这有多种方法。 Denis Gavrus建议使用一个很好的数组,但如果你想提高内存效率,你可以使用一个向量:
此外,如果您需要保留您的值和位置,您需要将它们存储在结构/类( ELEMENT 结构)中,这将需要一个单独的比较类/功能。
这是容器和比较功能:
struct ELEMENT{ ///Containing the value and the coordinates
int val, i, j;
};
bool cmp(ELEMENT a, ELEMENT b){
return a.val<b.val;
}
以下是处理数据的代码:
const int L=10; ///In case you want to modify the matrix dimensions
int array[L][L]; ///A really bad name for anything
vector<ELEMENT> v; ///The vector containing the sorted values
for(int i=0; i<L; i++) ///Initialize the matrix with 0
for(int j=0; j<L; j++)
array[i][j]=0;
array[0][0] = 3; ///Your values...
array[2][8] = 5;
array[4][0] = 4;
for(int i=0; i<L; i++)
for(int j=0; j<L; j++)
if(array[i][j]!=0)
v.push_back({array[i][j], i, j}); ///Insert into v the non-zero values and the coordinates
sort(v.begin(), v.end(), cmp);
for(ELEMENT i:v)///Your output
printf("%d at position (%d, %d)\n",i.val, i.i, i.j);
此外,您可以使用优先级队列:
优先级队列的比较类:
class cmp{ ///Containing the functor for the priority queue
public:
bool operator()(ELEMENT a, ELEMENT b){
return a.val<b.val;
}
};
执行操作的代码:
const int L=10; ///In case you want to modify the matrix dimensions
int array[L][L]; ///A really bad name for anything
priority_queue<ELEMENT, vector<ELEMENT>, cmp> v; ///The priority queue containing the sorted values
for(int i=0; i<L; i++) ///Initialize the matrix with 0
for(int j=0; j<L; j++)
array[i][j]=0;
array[0][0] = 3; ///Your values...
array[2][8] = 5;
array[4][0] = 4;
for(int i=0; i<L; i++)
for(int j=0; j<L; j++)
if(array[i][j]!=0)
v.push({array[i][j], i, j}); ///Insert into v the non-zero values
for(; !v.empty(); v.pop())
printf("%d at position (%d, %d)\n",v.top().val, v.top().i, v.top().j);