如何对大型2d数组进行排序C#

时间:2015-10-26 04:22:58

标签: c# sorting

我需要在第3列上对这三个双打的大数组进行排序...... MAG:

    var React = require('react');
    var storeMixin = require('project/shared/helpers/storeMixin');
    var RouterStore = require('project/router/RouterStore');

    module.exports = React.createClass({
        mixins: [storeMixin(RouterStore)],
        RedirectRegister: function () {
            location.href = "#usersignup";
        },

        RedirectLogin: function () {
            location.href = "#userlogin";
        },
   render: function () {
           return (

    <div>
            <div >
            <input type="submit" className="btn btn-primary" value="Register" onClick={this.RedirectRegister}/>
            </div>

            <div>
            <input type="submit" className="btn btn-primary" value="Login" onClick={this.RedirectLogin}/>
            </div>



    </div>

            );
        }
    });

访问就像:

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

表现很重要。

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

如果它更好更快,我可以将双打转换为StarList[x, y++] = RA; StarList[x, y++] = DEC; StarList[x, y] = MAG;

...谢谢

1 个答案:

答案 0 :(得分: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数组将被销毁,必须将其丢弃(即不存储或使用它)