我知道我在处理 vb6 之前已经问过这种问题,而且它太慢了,所以我决定使用 C# 来完成这项工作;现在相同的代码以两倍的速度运行,但仍然太慢了。
它慢的原因是它从每列的末尾开始按字典顺序排序,检查所有行。
我相信会加快这一进程的是,如果我从第一列开始排序过程,检查所有行并按该列的第一个字节检测最低行,并可能检测具有相同第一个低字节的多行并将它们分组以进行下一步它检查第二个(下一个)列,如果它们都相同,则检查第二个字节中的哪个是最低字节,等等。如果它检测到下一行字节不同的地方,那么列代码就完成了第一个字节并继续寻找第二低的字节..这实际上是我认为这个过程应该如何工作以获得良好的速度提升..但不幸的是我对这种排序技术有很大的困惑,最终使用了有人帮助我的东西.
当前代码通过蛮力排序从最后一列开始工作,它对所有行进行排序。然后将一列向左移动并重新对每一行重新排序,直到它到达第一列并对其进行排序。这很慢,因为它没有明显的原因进行迭代。
假设有 256 列和 256 行,总共 65,536 个数组元素.. 使用当前代码并说它必须对每一行进行多次排序,直到每一行得到正确的排序顺序。对于每一列,它可能需要 65,536 次迭代。因此,每次我调用该函数时,总共估计有 256*65536= 16,777,216次迭代,这就是它运行缓慢的实际原因。
我知道这有很多要求,但如果有人有空闲时间并且可能之前已经这样做过可以帮助我,我将不胜感激。
这是到目前为止我必须使用的代码。
byte[] sortArrayOfArraysLexicoGraphically(ref byte[] data) {
byte[] lexicoGraphicalIndexes;
long dataSize = data.Length;
long squareRootMinusOne;
int squareRoot;
int row = 0;
bool rowSwapped;
byte[] tmpRow;
squareRoot = (int)Math.Sqrt(dataSize);
tmpRow = new byte[squareRoot];
squareRootMinusOne = squareRoot - 1;
lexicoGraphicalIndexes = new byte[squareRoot];
for(short column = 0; column < lexicoGraphicalIndexes.Length; column++) {
lexicoGraphicalIndexes[column] = (byte)column;
}
for(long column = squareRootMinusOne; column >= 0; column -= 1) {
do {
rowSwapped = false;
do {
if(data[(row * squareRoot) + column] > data[((row + 1) * squareRoot) + column]) {
//Swaps a full row in a few copies.
//Copies full row to tmpRow
Buffer.BlockCopy(data, (row * squareRoot), tmpRow, 0, squareRoot);
//Replace first row with second row.
Buffer.BlockCopy(data, ((row + 1) * squareRoot), data, (row * squareRoot), squareRoot);
//Replace second row with tmpRow
Buffer.BlockCopy(tmpRow, 0, data, ((row + 1) * squareRoot), squareRoot);
swapBytes(ref lexicoGraphicalIndexes, row, row + 1);
rowSwapped = true;
}
row++;
} while (row < squareRootMinusOne);
row = 0;
} while (rowSwapped != false);
}
return lexicoGraphicalIndexes;
}
public void swapBytes(ref byte[] data, long firstIndex, long secondIndex) {
byte tmpFirstByte = data[firstIndex];
data[firstIndex] = data[secondIndex];
data[secondIndex] = tmpFirstByte;
}