我已经查找了一些网站,但找不到我的问题的答案。
这是我的代码:
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <time.h>
#include<iomanip>
#include<array>
#include <algorithm>
using namespace std;
const int AS = 6;
int filling(void);
void printing(int[AS][AS]);
int forsorting(int[][AS], int);
int main()
{
int funny = 0;
int timpa = 0;
int counter = 0;
int Array[AS][AS];
srand(time(0));
for (int i = 0; i<AS; i++)
{
for (int j = 0; j<AS; j++)
Array[i][j] = filling();
}
cout << "The unsorted array is" << endl << endl;
printing(Array);
cout << "The sorted array is" << endl << endl;
for (int il = 0; il<AS; il++)
{
for (int elle = 0; elle<AS; elle++)
Array[il][elle] =forsorting(Array, funny);
printing(Array);
}
system("PAUSE");
return 0;
}
int filling(void)
{
int kira;
kira = rand() % 87 + 12;
return kira;
}
void printing(int Array[AS][AS])
{
int counter = 0;
for (int i = 0; i<AS; i++)
{
for (int j = 0; j<AS; j++)
{
cout << setw(5) << Array[i][j];
counter++;
if (counter%AS == 0)
cout << endl << endl;
}
}
}
int forsorting(int Array[AS][AS], int funny)
{
int c, tmp, x;
int dice = 0;
int Brray[AS*AS];
int timpa = 0;
int super = 0;
//Transofrming Array[][] into Brray[]
for (int i = 0; i < AS; i++)
{
for (int k = 0; k < AS; k++)
{
Brray[timpa] = Array[i][k];
timpa++;
}
}
//Bubble sorting in Brray[]
for (int passer = 1; passer <= AS-1; passer++)
{
for (int timon = 1; timon <= AS-1; timon++)
{
if (Brray[timpa]>Brray[timpa + 1])
{
super = Brray[timpa];
Brray[timpa] = Brray[timpa + 1];
Brray[timpa + 1] = super;
}
}
}
//Transforming Brray[] into Array[][]
for (int e = 0; e<AS; e++)
{
for (int d = 0; d<AS; d++)
{
Brray[dice] = Array[e][d];
dice++;
}
}
***There's a part missing here***
}
我要做的是,使用 3 个函数编写一个程序。
- 第一个函数会随机填充我的二维数组(这部分没问题)
- 第二个函数会在屏幕上打印未排序的数组(这部分没问题)
- 第三个函数将按对角线对我的数组进行排序,如下图所示:
然后我需要调用第二个函数来打印排序后的数组。我的问题是第三个函数,我将二维数组转换为一维数组并使用冒泡排序对其进行排序,但我不能做的是将其转换回对角线排序的二维数组。
最佳答案
如果您可以将二维数组转换为一维数组,那么转换回来就是相反的过程。采取相同的循环并围绕分配进行更改。
但是在您的情况下,转换本身是错误的。它应按 (0;0)、(0;1)、(1;0) 的顺序采用索引。但它所做的是按 (0;0)、(0;1)、(1;1) 的顺序获取索引。
我的建议是利用每条对角线上的 X 坐标和 Y 坐标之和相同并且从 0 到 AS*2-2 的事实。
然后使用另一个循环,您可以检查所有可能的有效 x/y 组合。像这样:
for ( int sum = 0; sum < AS*2-1; sum++ )
{
for ( int y = sum >= AS ? sum-AS+1 : 0; y < AS; y++ )
{
x = sum - y;
// Here assign either from Array to Brray or from Brray to Array
}
}
附言如果你想变得非常聪明,我很确定你可以制作一个数学(非迭代)函数,将 Brray 中的索引转换为 Array 中的索引对,反之亦然。然后您可以就地应用冒泡排序。但这比我现在愿意弄清楚的要棘手一些。不过,您可能会因此获得额外的奖励。
附言第二天早上实现:你可以使用这种方法直接在二维数组中实现冒泡排序。无需复制。可以这样想:如果你知道一对 (x;y) 坐标,你可以很容易地找出列表中的下一个 (x;y) 坐标。所以你可以从任何一点向前移动数组。无论如何,这就是冒泡排序所需要的。
关于c++ - 对角排列数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914410/