C按升序或降序打印2D数组元素

时间:2015-12-01 10:41:44

标签: c arrays sorting

我有一个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.
    }

然而,这使得我多次遍历数组(与非零元素一样多)。是否会有更好的(即减少操作)方式来做到这一点?

编辑:我忘了指定我想使用输出中的位置;所以我不仅需要排序的值;还有他们的指数...

3 个答案:

答案 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);