Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的高级数组排序/重新排列_Java_Arrays_Sorting - Fatal编程技术网

Java中的高级数组排序/重新排列

Java中的高级数组排序/重新排列,java,arrays,sorting,Java,Arrays,Sorting,所以我有一个数组,具有以下理论值: int[] elements = {A1, A2, B1, B2, A3, A4, B3, B4, C1, C2, D1, D2, C3, C4, D3, D4}; 示意图: + - + - + - + - + | A | A | B | B |

所以我有一个数组,具有以下理论值:

int[] elements = {A1, A2, B1, B2,
                  A3, A4, B3, B4,
                  C1, C2, D1, D2,
                  C3, C4, D3, D4};
示意图:

                  + - + - + - + - +
                  | A | A | B | B |
                  + - + - + - + - +
                  | A | A | B | B |
                  + - + - + - + - +
                  | C | C | D | D |
                  + - + - + - + - +
                  | C | C | D | D |
                  + - + - + - + - +
                  + - + - + - + - +
                  | A | A | A | A |
                  + - + - + - + - +
                  | B | B | B | B |
                  + - + - + - + - +
                  | C | C | C | C |
                  + - + - + - + - +
                  | D | D | D | D |
                  + - + - + - + - +
简单地说,我希望将阵列重新安排为以下形式:

int[] elements = {A1, A2, A3, A4,
                  B1, B2, B3, B4,
                  C1, C2, C3, C4,
                  D1, D2, D3, D4};
示意图:

                  + - + - + - + - +
                  | A | A | B | B |
                  + - + - + - + - +
                  | A | A | B | B |
                  + - + - + - + - +
                  | C | C | D | D |
                  + - + - + - + - +
                  | C | C | D | D |
                  + - + - + - + - +
                  + - + - + - + - +
                  | A | A | A | A |
                  + - + - + - + - +
                  | B | B | B | B |
                  + - + - + - + - +
                  | C | C | C | C |
                  + - + - + - + - +
                  | D | D | D | D |
                  + - + - + - + - +
这个特定的示例包含四个扇区(A、B、C和D),但无论数组包含多少个扇区,以及每个扇区包含多少个元素,我需要的算法都应该有效

已知每个扇区的大小(扇区宽度和扇区高度)以及扇区的数量(行和列)。所有扇区的大小(宽度和高度)完全相同。扇区数量必须描述为两个值(行和列),然后将其乘以以构成扇区的实际总和。如果需要5个扇区,则可以指定1行和5列

下面是执行此排序的方法的示例:

public int[] sectorSort(int[] elements,
                        int sectorWidth,
                        int sectorHeight,
                        int columns,
                        int rows);
其他扇区设置示例:

                  Columns: 5
                  + - + - + - + - + - + - + - + - + - + - +
                  | A | A | B | B | C | C | D | D | E | E |
     Rows: 1      + - + - + - + - + - + - + - + - + - + - +
                  | A | A | B | B | C | C | D | D | E | E |
                  + - + - + - + - + - + - + - + - + - + - +

                  Columns: 2
                  + - + - + - + - +
                  | A | A | B | B |
                  + - + - + - + - +
                  | A | A | B | B |
                  + - + - + - + - +
                  | C | C | D | D |
     Rows: 3      + - + - + - + - +
                  | C | C | D | D |
                  + - + - + - + - +
                  | E | E | F | F |
                  + - + - + - + - +
                  | E | E | F | F |
                  + - + - + - + - +
我计划用它为我正在制作的游戏引擎制作一个高效的精灵地图类。数组中的元素是ARGB颜色值,扇区是单个精灵。如果不同的精灵按后一种顺序排列,则搜索单个精灵的速度会更快,内存效率也会更高

谢谢大家!

编辑1:清晰


EDIT2:添加了更多的条件和澄清。

您可以采用一种直接的算法,迭代所有扇区和其中的所有元素,以重新排列它们。这将是O(n*m),n=扇区数,m=每个扇区的元素数。但是您必须重新排列整个阵列。作为替代方案(如果内存非常重要),您可以创建原始阵列的基于扇区的视图,这将需要O(n)来创建视图,然后O(m)来读取单个扇区的值


因此,在这两种情况下,读取所有扇区都需要O(n*m)。您希望有什么改进?

您不会得到比这更好的时间复杂度: 它创建一个新阵列并将每个扇区复制到其中

static T[] sectorSort<T>(T[] elements, int sectorWidth, int sectorHeight, int columns, int rows)
        {
            T[] sortedElements = new T[elements.Length];
            int n = 0;
            int arrWidth = sectorWidth * columns;
            for(int secY = 0; secY < rows; secY++)
                for (int secX = 0; secX < columns; secX++)
                {
                    int baseIndex = secY * arrWidth * sectorHeight + secX * sectorWidth;
                    for(int y = 0; y < sectorHeight; y++)
                        for (int x = 0; x < sectorWidth; x++)
                        {
                            int sourceIndex = baseIndex + y * arrWidth + x;
                            sortedElements[n++] = elements[sourceIndex];
                        }
                }
            return sortedElements;
        }
static T[]sectorSort(T[]元素,int sectorWidth,int sectorHeight,int列,int行)
{
T[]sortedElements=新的T[elements.Length];
int n=0;
int arrWidth=扇区宽度*列;
对于(int secY=0;secY
我仍然可以看到很多可以完成的优化,但是阅读你的问题,我发现这是在加载时间内完成的,所以不要对此大惊小怪

编辑:固定代码

编辑2:测试设置(C#)

int[]数组=新的int[]
{
11, 12, 13, 21, 22, 23, 51, 52, 53,
14, 15, 16, 24, 25, 26, 54, 55, 56,
17, 18, 19, 27, 28, 29, 57, 58, 59,
31, 32, 33, 41, 42, 43, 61, 62, 63,
34, 35, 36, 44, 45, 46, 64, 65, 66,
37, 38, 39, 47, 48, 49, 67, 68, 69,
71, 72, 73, 81, 82, 83, 91, 92, 93,
74, 75, 76, 84, 85, 86, 94, 95, 96,
77, 78, 79, 87, 88, 89, 97, 98, 99,
};
int[]排序=扇区排序(数组,3,3,3,3);
对于(int y=0;y<9;y++)
{
对于(int x=0;x<9;x++)
Console.Write(排序为[x+y*9]+“|”);
Console.WriteLine(“\n”);
}

所有扇区都保证大小相同吗?请为5个扇区添加一个示例,因为我无法想象超过4个扇区的情况。@Ralph:我可以看到我脑海中的平方数(4、9、16),但我无法可靠地想象其他任何东西……如果是6,它是在3x2还是2x3配置中设置的?好的,我忘记了一些条件。我现在正在添加它们。非常感谢。您是要重新排列现有数组,还是返回一个包含已安排内容的新数组?假设我想要扇区D中的所有值,那么我需要使用一种算法,按顺序查找适当的值并返回它们。这不是一个非常困难的操作,但是如果要频繁地执行它,它将比扇区D中的所有值都紧跟在一起慢得多。您只需要知道第一个值在哪里以及有多少个值。我试了好几次你的方法,但都没能成功。我需要一个更实际的例子。是的,这就是我所说的直接算法:)+1写下来!你比我走得更远,但是算法没有给我正确的结果。给它
[11,12,21,22,13,14,23,24,31,32,41,42,33,34,43,44]
使它返回
[11,12,13,14,21,22,23,24,13,14,31,32,23,24,41,42]
。前两个扇区排序正确,但其他两个扇区排序错误。非常感谢!工作起来很有魅力!对2x2扇区来说是这样的。我在3x3上试过,每个扇区都有3x3个值。好像什么都不对。我将调查您的代码。;)3x3,带3x3扇区对我来说很好。您是否为扇区宽度、扇区高度、列和行设置了正确的值?我将添加我的测试设置。