如何从主对角线上方的2D数组中排序元素

时间:2019-02-01 20:47:55

标签: c++ c

在不使用内置函数,库或指针的情况下,如何对主对角线上方的2D数组中的元素进行排序。

我真的找不到任何解释或在其他网站上。我试图将2D数组更改为1D数组,然后进行排序,但找不到代码背后的逻辑。

例如在4x4阵列中:

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

要打印:

 1 12  8  7
 5  6  4  3 
 9 10 11  2
13 14 15 16

2 个答案:

答案 0 :(得分:1)

在不涉及实际编写算法的细节的情况下,以下是分解和解决此问题的方法的示例:

  1. 遍历2D数组并找出哪些值在主对角线“上方”。将这些值存储在数据结构(可能是一维数组)中

  2. 对生成的数组进行排序(我假设您已经学习了如何对数组进行排序,但是请告诉我此步骤是否有问题)

  3. 使用这些排序后的元素构建一个新的2D数组,并找到一种方法将排序后的元素放回正确的位置,并使主对角线上和下方的所有内容均保持其旧位置。 (提示:是否存在从排序后的元素索引到2D数组上对角线的映射?)

希望这将帮助您编写此算法!让我知道我是否对该问题有误解,或者您有疑问。

答案 1 :(得分:-2)

我使用了4个循环。内部2个循环找到max元素,外部2个循环将最大元素放置到方便的单元格中。

#include <stdio.h>
typedef enum {
    false = 0,
    true = 1
}bool;

int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
bool change = false;

int main()
{
    int a , b;
    for(int k = 0 ; k < 4; k++){
        for(int l = k + 1; l < 4 ; l++){
            int max = x[k][l];
            for(int m = k; m < 4; m++){
                for(int n = l; n < 4; n++){
                    if(x[m][n] > max){
                        max = x[m][n];
                        a = m;
                        b = n;
                        change = true;
                    }
                }
            }
            if(change)
            {
                x[a][b] = x[k][l];
                x[k][l] = max;
                change = false;
            }
        }
    }

for (int o = 0; o < 4 ; o++){
    for(int u = 0; u < 4; u++){
        printf("%d ",x[o][u]);
    }
    printf("\n");
}
return 0;

}