gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:38 24 4
gpt4 key购买 nike

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

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 |
+ - + - + - + - +

简单地说,我希望将数组重新排列成以下形式:

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

说明图:

                  + - + - + - + - +
| 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 |
+ - + - + - + - +

我计划使用它为我正在制作的游戏引擎制作一个高效的 Sprite 贴图类。数组中的元素是 ARGB 颜色值,扇区是单个 Sprite 。如果不同的 sprite 按后一种顺序排列,则搜索单个 sprite 的速度会快得多并且内存效率更高。

谢谢!

编辑 1:清晰度。

EDIT2:添加了更多条件和说明。

最佳答案

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

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;
}

我仍然可以看到很多可以完成的优化,但是阅读你的问题我看到这是在加载时间完成的,所以不要大惊小怪。

编辑:固定代码

EDIT2:测试设置(C#)

    int[] array = new 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[] sorted = sectorSort(array, 3, 3, 3, 3);
for (int y = 0; y < 9; y++)
{
for (int x = 0; x < 9; x++)
Console.Write(sorted[x + y * 9] + " | ");
Console.WriteLine("\n");
}

关于java - Java 中的高级数组排序/重新排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com