如何分别对2D数组的每一行进行排序?

时间:2016-12-21 11:54:59

标签: c# arrays visual-studio sorting multidimensional-array

我想创建一个程序,用户必须输入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

3 个答案:

答案 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)

如果您按照单独的步骤进行排序和重组,那就很简单了:

  1. 将结果收集在一个平面(即一维)数组中。

  2. 对平面数组进行排序(例如,使用Array.Sort(...))。

  3. 通过循环平面阵列构建新的数据结构。你不需要在这里进行任何进一步的排序。每次只需将[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;
}