如何按列对二维数组(锯齿状)进行排序



我正试图弄清楚如何对二维数组进行排序。我看到这个问题发布在其他语言上,但不是C#。我正在处理一个编码挑战,其中输入是二维数组的形式,我需要按第一列排序。

我正在考虑为一个2维int数组创建一个扩展方法,该数组在左列或右列使用一个参数,但不确定什么是最好的排序算法。我想我可以将2D int数组转换为SortedDictionary,然后再将其转换回来,但如果我再次将其转换回2D数组,似乎效率会很低。最好转换为SortedDictionary并将其保留在该数据类型中,还是有人对2D数组有惊人的排序算法?

public static int[][] Sort(this int[][] a2DArr, bool sortLeftCol = true)
{
SortedDictionary<int, int> sd = new SortedDictionary<int, int>();
int[][] sorted2Darr = new int[a2DArr.Count()][];
if (sortLeftCol == true)
{
for (int i = 0; i < a2DArr.Count(); i++)
{ sd.Add(a2DArr[i][0], a2DArr[i][1]); }
for (int i = 0; i < a2DArr.Count(); i++)
{
sorted2Darr[i][0] = sd.ElementAt(i).Key;
sorted2Darr[i][1] = sd.ElementAt(i).Value;
}
}
else //sort by right column
{
for (int i = 0; i < a2DArr.Count(); i++)
{ sd.Add(a2DArr[i][1], a2DArr[i][0]); }
for (int i = 0; i < a2DArr.Count(); i++)
{
sorted2Darr[i][0] = sd.ElementAt(i).Value;
sorted2Darr[i][1] = sd.ElementAt(i).Key;
}
}
return sorted2Darr;
}

我发现有人问了一个类似的问题,但关于矩形数组。这是一个很好的使用数组的小方法。用lambda表达式排序:

Array.Sort(contests, (a, b) => { return a[0] - b[0]; });

它将按第一列对2D数组进行排序,并将相应的数据保留在第二列(类似于按ID对行进行排序(。如果任何一行的左边有相同的值,但右边有不同的值,那么它将按这些行中第二列的值排序。

如果您为第一个值输入1,则它将按右列排序:

Array.Sort(contests, (a, b) => { return a[1] - b[0]; });

最新更新