需实现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
相关产品推荐
相关产品推荐

