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

前端之家收集整理的这篇文章主要介绍了Java中的高级数组排序/重新排列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有一个具有以下理论值的数组:
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,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 |
                  + - + - + - + - +

我打算用它来为我正在制作的游戏引擎制作一个高效的精灵地图类.数组中的元素是ARGB颜色值,扇区是单独的精灵.如果不同的精灵按后一种顺序排列,那么搜索单个精灵的速度要快得多,并且内存效率也会提高.

谢谢!

编辑1:清晰度.

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

解决方法

你不会比这更好地获得时间复杂性:
它创建一个新数组并将每个扇区复制到其中.
static T[] sectorSort<T>(T[] elements,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);
    for (int y = 0; y < 9; y++)
    {
        for (int x = 0; x < 9; x++)
            Console.Write(sorted[x + y * 9] + " | ");
        Console.WriteLine("\n");
    }

猜你在找的Java相关文章