c++ - 对角排列数组

标签 c++ arrays sorting

我已经查找了一些网站,但找不到我的问题的答案。

这是我的代码:

#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 个函数编写一个程序。

  • 第一个函数会随机填充我的二维数组(这部分没问题)
  • 第二个函数会在屏幕上打印未排序的数组(这部分没问题)
  • 第三个函数将按对角线对我的数组进行排序,如下图所示:

Sample

然后我需要调用第二个函数来打印排序后的数组。我的问题是第三个函数,我将二维数组转换为一维数组并使用冒泡排序对其进行排序,但我不能做的是将其转换回对角线排序的二维数组。

最佳答案

如果您可以将二维数组转换为一维数组,那么转换回来就是相反的过程。采取相同的循环并围绕分配进行更改。

但是在您的情况下,转换本身是错误的。它应按 (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/

相关文章:

c# - 使用 linq 对 XMLDocument 进行排序

c# - 错误索引超出范围。必须是非负数且小于集合的大小

javascript - 如何使用jquery获取多个相同类名的span值

java - 数组中同一索引有两个值

c# - 如何排序 List<T> 其中 T 是我自己的类,我想按 class.someString 排序

c++ - 构造函数中引发的异常的处理程序是什么?

c++ - 模板运算符[]重载奇怪的C2676

c++ - 如何将列表序列化为字符数组

c++ - 从不同的架构加载 dylib

javascript - 使用 JavaScript Array.sort() 方法进行洗牌是否正确?