在不使用内置函数,库或指针的情况下,如何对主对角线上方的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
答案 0 :(得分:1)
在不涉及实际编写算法的细节的情况下,以下是分解和解决此问题的方法的示例:
遍历2D数组并找出哪些值在主对角线“上方”。将这些值存储在数据结构(可能是一维数组)中
对生成的数组进行排序(我假设您已经学习了如何对数组进行排序,但是请告诉我此步骤是否有问题)
使用这些排序后的元素构建一个新的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;
}