2015-10-26 18 views
0

我需要在第3列这座大阵的三项双打排序... MAG:我如何排序的大型二维数组C#

double[,] StarList = new double[1000000, 3]; 

访问是这样的:

StarList[x, y++] = RA; 

StarList[x, y++] = DEC; 

StarList[x, y] = MAG; 

性能重要。

就地会很好,但不是必需的。

如果它更好更快,我可以将双打转换为Int32

谢谢...

+0

排序1维数组或第三列数组没有区别。算法取决于您拥有的数据和约束条件。可能只是使用标准算法? –

回答

2

最简单的办法: 多维数组只是不适合那个。你最好考虑替代表示。例如,下面的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数组将被销毁并且必须被丢弃(即,不要存储或使用它)

+0

简单的方法是美好的。非常感谢你! – JerryG