You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需实现C#矩阵行排序、峰值查找功能(附现有代码求助)

问题描述

我需要编写C#程序,实现以下功能:

  • 生成包含1-100随机整数的20×5矩阵
  • 对矩阵进行转置
  • 将转置后的矩阵每一行从小到大排序
  • 查找矩阵的峰值
    要求必须使用类实现,目前已完成矩阵生成与转置打印功能,求助如何编写实现行排序和峰值查找的类方法。现有代码如下:
using System;

namespace my_matrix;
class Program
{
    public int[,] Create(int[,] myarray, int Row, int Clm)
    {
        Random value = new Random();
        myarray = new int[Row, Clm];
        int i = 0;
        int j = 0;
        while (i < Row)
        {
            while (j < Clm)
            {
                myarray[i, j] = value.Next(1, 100);
                j++;
            }
            i++;
            j = 0;
        }

        return myarray;
    }
    public int[,] Print(int[,] myarray, int Row, int Clm)
    {
        Console.WriteLine("=====ARRAY=====");
        for (int a = 0; a < Row; a++)
        {
            for (int b = 0; b < Clm; b++)
            {
                Console.Write(myarray[a, b] + " ");
            }
            Console.WriteLine();
        }
        return null;
    }

    public int[,] Transpose(int[,] myarray, int Row, int Clm)
    {
        for (int b = 0; b < Clm; b++)
        {
            for (int a = 0; a < Row; a++)
            {
                Console.Write(myarray[a, b] + " ");
            }
            Console.WriteLine();
        }
        return myarray;
    }
    public int[,] Print_Transpose(int[,] myarray, int Row, int Clm)
    {
        Console.WriteLine("=====TRANSPOSE=====");

        for (int b = 0; b < Clm; b++)
        {
            for (int a = 0; a < Row; a++)
            {
                Console.Write(myarray[a, b] + " ");
            }
            Console.WriteLine();
        }
        return null;
    }


    static void Main(string[] args)
    {
        Program x = new Program();
        int[,] myarray = new int[20, 5];
        int[,] a = x.Create(myarray, 20, 5);
        x.Print(a, 20, 5);
        x.Print_Transpose(a, 20, 5);
    }
}
解决方案

首先注意:你的Transpose和Print_Transpose方法仅打印了转置效果,并未生成真正的转置矩阵。后续要对转置后的矩阵排序,必须先得到实际的转置矩阵,以下是完整实现步骤:

1. 修正转置方法(生成真实转置矩阵)

修改转置方法,返回新的转置矩阵,同时调整打印逻辑:

// 生成转置矩阵
public int[,] Transpose(int[,] myarray, int row, int col)
{
    int[,] transposedArray = new int[col, row];
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            transposedArray[j, i] = myarray[i, j];
        }
    }
    return transposedArray;
}

// 打印转置矩阵
public void PrintTranspose(int[,] transposedArray)
{
    Console.WriteLine("=====TRANSPOSE=====");
    int row = transposedArray.GetLength(0);
    int col = transposedArray.GetLength(1);
    for (int a = 0; a < row; a++)
    {
        for (int b = 0; b < col; b++)
        {
            Console.Write(transposedArray[a, b] + " ");
        }
        Console.WriteLine();
    }
}

2. 实现行排序方法

遍历矩阵每一行,提取为一维数组排序后放回:

// 对矩阵每行从小到大排序
public int[,] SortRows(int[,] matrix)
{
    int rowCount = matrix.GetLength(0);
    int colCount = matrix.GetLength(1);
    int[,] sortedMatrix = new int[rowCount, colCount];

    for (int i = 0; i < rowCount; i++)
    {
        int[] row = new int[colCount];
        // 提取当前行
        for (int j = 0; j < colCount; j++)
        {
            row[j] = matrix[i, j];
        }
        // 排序
        Array.Sort(row);
        // 放回矩阵
        for (int j = 0; j < colCount; j++)
        {
            sortedMatrix[i, j] = row[j];
        }
    }
    return sortedMatrix;
}

// 打印排序后的矩阵
public void PrintSortedMatrix(int[,] sortedMatrix)
{
    Console.WriteLine("=====SORTED MATRIX=====");
    int rowCount = sortedMatrix.GetLength(0);
    int colCount = sortedMatrix.GetLength(1);
    for (int a = 0; a < rowCount; a++)
    {
        for (int b = 0; b < colCount; b++)
        {
            Console.Write(sortedMatrix[a, b] + " ");
        }
        Console.WriteLine();
    }
}

3. 实现峰值查找方法

峰值定义:元素大于等于其上下左右相邻元素(边界元素只需大于等于存在的相邻元素),以下方法会找出所有峰值并打印:

using System.Collections.Generic;
using System;

// 查找并打印矩阵所有峰值
public List<Tuple<int, int, int>> FindPeaks(int[,] matrix)
{
    List<Tuple<int, int, int>> peaks = new List<Tuple<int, int, int>>();
    int rowCount = matrix.GetLength(0);
    int colCount = matrix.GetLength(1);

    for (int i = 0; i < rowCount; i++)
    {
        for (int j = 0; j < colCount; j++)
        {
            int current = matrix[i, j];
            bool isPeak = true;

            // 检查相邻元素
            if (i > 0 && matrix[i - 1, j] > current) isPeak = false;
            if (i < rowCount - 1 && matrix[i + 1, j] > current) isPeak = false;
            if (j > 0 && matrix[i, j - 1] > current) isPeak = false;
            if (j < colCount - 1 && matrix[i, j + 1] > current) isPeak = false;

            if (isPeak)
            {
                peaks.Add(Tuple.Create(i, j, current));
            }
        }
    }

    // 输出结果
    Console.WriteLine("=====PEAKS=====");
    if (peaks.Count == 0)
    {
        Console.WriteLine("未找到峰值");
    }
    else
    {
        foreach (var peak in peaks)
        {
            Console.WriteLine($"峰值: {peak.Item3},位置({peak.Item1}, {peak.Item2})");
        }
    }
    return peaks;
}

4. 更新Main方法串联所有功能

static void Main(string[] args)
{
    Program x = new Program();
    int originalRow = 20;
    int originalCol = 5;

    // 生成并打印原矩阵
    int[,] originalArray = x.Create(null, originalRow, originalCol);
    x.Print(originalArray, originalRow, originalCol);

    // 转置并打印
    int[,] transposedArray = x.Transpose(originalArray, originalRow, originalCol);
    x.PrintTranspose(transposedArray);

    // 排序并打印
    int[,] sortedMatrix = x.SortRows(transposedArray);
    x.PrintSortedMatrix(sortedMatrix);

    // 查找峰值
    x.FindPeaks(sortedMatrix);
}

额外优化建议

  • 原Create方法的myarray参数无意义,可简化为public int[,] Create(int row, int col)
  • 方法命名遵循C# PascalCase规范,比如Print_Transpose改为PrintTranspose
  • 原Print方法返回null无意义,可改为void类型

内容的提问来源于stack exchange,提问作者Ece

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:05:29