我需要在第3列这座大阵的三项双打排序... MAG:我如何排序的大型二维数组C#
double[,] StarList = new double[1000000, 3];
访问是这样的:
StarList[x, y++] = RA;
StarList[x, y++] = DEC;
StarList[x, y] = MAG;
性能重要。
就地会很好,但不是必需的。
如果它更好更快,我可以将双打转换为Int32
。
谢谢...
我需要在第3列这座大阵的三项双打排序... MAG:我如何排序的大型二维数组C#
double[,] StarList = new double[1000000, 3];
访问是这样的:
StarList[x, y++] = RA;
StarList[x, y++] = DEC;
StarList[x, y] = MAG;
性能重要。
就地会很好,但不是必需的。
如果它更好更快,我可以将双打转换为Int32
。
谢谢...
最简单的办法: 多维数组只是不适合那个。你最好考虑替代表示。例如,下面的struct
的一个维数组将具有完全相同的布局和你一样:
struct StarInfo { public double RA, DEC, MAG; }
声明:
var StarList = new StarInfo[1000000];
访问:
StarList[x].RA = RA;
StarList[x].DEC = DEC;
StarList[x].MAG = MAG;
,可以很容易进行排序:
Array.Sort(StarList, (a, b) => a.MAG.CompareTo(b.MAG));
困难的方法:如果你仍然坚持使用多维数组,这里是你可以做的。
首先,使用间接排序:
var sortIndex = new int[StarList.GetLength(0)];
for (int i = 0; i < sortIndex.Length; i++)
sortIndex[i] = i;
Array.Sort(sortIndex, (a, b) => StarList[a, 2].CompareTo(StarList[b, 2]));
然后
(A)存储sortIndex
,当你需要按顺序访问列表行使用,即代替StarList[x, c]
使用StarList[sortIndex[x], c]
(B)使用sortIndex
和众所周知的原位算法对您的列表重新排序:
var temp = new double[3];
for (int i = 0; i < sortIndex.Length; i++)
{
if (sortIndex[i] == i) continue;
for (int c = 0; c < temp.Length; c++)
temp[c] = StarList[i, c];
int j = i;
while (true)
{
int k = sortIndex[j];
sortIndex[j] = j;
if (k == i) break;
for (int c = 0; c < temp.Length; c++)
StarList[j, c] = StarList[k, c];
j = k;
}
for (int c = 0; c < temp.Length; c++)
StarList[j, c] = temp[c];
}
请注意,在这样做之后,sortIndex
数组将被销毁并且必须被丢弃(即,不要存储或使用它)
简单的方法是美好的。非常感谢你! – JerryG
排序1维数组或第三列数组没有区别。算法取决于您拥有的数据和约束条件。可能只是使用标准算法? –