我想创建一个程序,用户必须输入100个数字的列表。 结果必须是具有34行和3列的2维矩阵(其中最后一行只有1个数)。 现在我想:首先按升序对数组进行排序。然后我想按降序分别对每一行进行排序。
我将演示一个包含10个元素的二维数组
如果这些是用户输入的数字:2,4,6,9,5,2,3,4,9,7 我希望数组看起来像这样:
3 2 2
5 4 4
9 7 6
9
答案 0 :(得分:0)
我认为从1D阵列开始会更容易,如果你真的需要,你可以稍后复制到2D阵列。
Array.Sort(input); //input is an int[100]
//Now, sort each row in descending order
var comparer = Comparer<int>.Create((a, b) => b.CompareTo(a));
for (int row = 0; row < 99; r+=3) {
Array.Sort(input, row, 3, comparer);
}
答案 1 :(得分:0)
如果您按照单独的步骤进行排序和重组,那就很简单了:
将结果收集在一个平面(即一维)数组中。
对平面数组进行排序(例如,使用Array.Sort(...)
)。
通过循环平面阵列构建新的数据结构。你不需要在这里进行任何进一步的排序。每次只需将[arr[n+2], arr[n+1], arr[n]]
作为新2D数组中的行,然后跳转到n = n + 3
。
答案 2 :(得分:0)
我也赞成通过循环排序的输入结构来创建输出结构。以下将实现您想要的。它将采用任意大小的整数数组和二维输出数组所需的列数,并返回您定义的结果。
public static int?[,] SortInput(int[] input, int requiredColumnCount)
{
// Guard conditions.
if (input == null)
throw new ArgumentNullException(nameof(input));
if (input.Length < 1)
throw new ArgumentOutOfRangeException(nameof(input));
if (requiredColumnCount < 1)
throw new ArgumentOutOfRangeException(nameof(requiredColumnCount));
var inputLength = input.Length;
// Sort the input array in ascending order.
Array.Sort(input);
// Dimension the output array.
var requiredRowCount = (int)Math.Ceiling((decimal)inputLength / requiredColumnCount);
var output = new int?[requiredRowCount, requiredColumnCount];
// Setup variables to check for special handling of last output row.
var lastRowIndex = output.GetUpperBound(0);
var columnCountForLastRow = inputLength % requiredColumnCount;
// Populate the output array.
for (var inputIndex = 0; inputIndex < inputLength; inputIndex += requiredColumnCount)
{
var rowIndex = inputIndex / requiredColumnCount;
// Special handling may be required if there are insufficient
// input values to fully populate the last output row.
if ((rowIndex == lastRowIndex) && (columnCountForLastRow != 0))
requiredColumnCount = columnCountForLastRow;
for (var columnIndex = 0; columnIndex < requiredColumnCount; columnIndex++)
{
output[rowIndex, columnIndex] = input[inputIndex + requiredColumnCount - columnIndex - 1];
}
}
return output;
}