我知道在处理vb6之前我已经问过这种问题,并且它太慢了,所以我决定使用C#来完成这项工作;现在相同的代码以两倍的速度运行,但仍然太慢。使用C#的数组排列算法的辞典排序算法#
它慢的原因是它从每列的末尾开始检查所有行的词典排序。
我相信会加快这一点,如果我从第一列开始排序过程检查所有行,并检测该列的第一个字节的最低行,并可能多个行具有相同的第一个低字节并将它们分组对于检查第二个(下一个)列的下一个步骤,如果它们都是相同的移动到下一个列等等,则检查第二个字节中哪个是最低字节。如果它检测到下一个行字节的不同,那么列代码是为第一个字节完成的,然后继续找到第二个最低的..这实际上是我认为这个过程应该工作以获得一个很好的速度提升..但不幸的是,我对这个排序技术有很大的困惑,并最终使用了什么有人帮助我。
当前代码通过从最后一列对所有行进行蛮力排序来工作......然后它将一列向左移动并重新对每一行重新排序直到它到达第一列并对其排序。这很慢,因为它没有明显的原因进行迭代。
假设有256列和256行共65536个数组元素,使用当前代码并且说它必须多次对每行进行排序,直到每行得到适当的排序顺序。对于每列可能需要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;
}
您的代码存在的问题是您使用了具有O(N * N)复杂性的排序算法(类似于Bubble Sort)。您应该像[QuickSort](http://en.wikipedia.org/wiki/Quicksort)一样实施更好的排序算法,或像我一样使用.Net的排序功能。 –
真的看不到其他任何方式。我排序共同具有相同的第一个字节的行,然后只是交换第一行,第二个等等。按顺序,这就是它。罕见情况下的主要排序代码最终可能最多排序5-7行。只包含共同第一个字节的行只是立即添加到顶部,而不进行排序只是交换先前在那里的内容。 – SSpoke
我强烈建议从[这里]下载morelinq的二进制文件(http://code.google.com/p/morelinq/)并测试上述代码。我真的不能说我非常了解你的算法,我的代码也做了同样的事情,但至少你可以看到速度的不同。 (PS:你不必使用更多的LINQ,将输入数组分割成Sqrt(N)部分,我只是为了“易于使用”而使用它) –