如何在C#中不使用List.Add等方法查找多维数组的第N大元素
不使用集合方法查找多维数组中第N大元素的C#实现
要实现这个需求,核心思路是手动遍历多维数组收集目标值到一维数组,再通过排序找到第N大元素,全程不依赖List.Add这类集合方法。以下分两种场景实现:
场景1:查找代码中toplam值的第N大元素
你的代码片段是计算每个(i,j)对应的三维子数组求和值toplam,我们可以先把所有toplam收集到一维数组,再排序取第N大:
int[,,,] x = new int[100, 20, 35, 200]; // 假设这里已经给数组x完成赋值 // 1. 计算toplam的总数:100*i *20*j = 2000个 int toplamCount = x.GetLength(0) * x.GetLength(1); int[] toplamArray = new int[toplamCount]; int index = 0; // 2. 遍历收集所有toplam值 for (int i = 0; i < x.GetLength(0); i++) { for (int j = 0; j < x.GetLength(1); j++) { int toplam = 0; for (int k = 0; k < x.GetLength(2); k++) { for (int l = 0; l < x.GetLength(3); l++) { toplam += x[i, j, k, l]; } } toplamArray[index++] = toplam; } } // 3. 对数组进行升序排序 Array.Sort(toplamArray); // 4. 获取第N大元素(以第5大为例) int n = 5; // 升序数组中,第N大的元素位于「数组长度 - N」的索引位置 int fifthLargest = toplamArray[toplamCount - n]; Console.WriteLine($"第5大的toplam值:{fifthLargest}"); // 同理获取第7大、第15大元素 int seventhLargest = toplamArray[toplamCount - 7]; int fifteenthLargest = toplamArray[toplamCount - 15];
场景2:查找多维数组本身元素的第N大元素
如果要直接找四维数组x中所有元素的第N大,步骤类似:
int[,,,] x = new int[100, 20, 35, 200]; // 假设这里已经给数组x完成赋值 // 1. 计算数组总元素数 long totalElements = (long)x.GetLength(0) * x.GetLength(1) * x.GetLength(2) * x.GetLength(3); int[] allElements = new int[totalElements]; long elemIndex = 0; // 2. 遍历多维数组,将元素填充到一维数组 for (int i = 0; i < x.GetLength(0); i++) { for (int j = 0; j < x.GetLength(1); j++) { for (int k = 0; k < x.GetLength(2); k++) { for (int l = 0; l < x.GetLength(3); l++) { allElements[elemIndex++] = x[i, j, k, l]; } } } } // 3. 对数组进行升序排序 Array.Sort(allElements); // 4. 获取第N大元素(以第5大为例) int n = 5; int fifthLargestElement = allElements[allElements.Length - n]; Console.WriteLine($"第5大的元素:{fifthLargestElement}");
可选:手动实现排序(不依赖Array.Sort)
如果不想使用框架自带的排序方法,可以手动实现冒泡排序(降序),直接取对应索引的元素:
// 手动实现降序冒泡排序 for (int i = 0; i < toplamArray.Length; i++) { for (int j = 0; j < toplamArray.Length - i - 1; j++) { if (toplamArray[j] < toplamArray[j + 1]) { // 交换元素位置 int temp = toplamArray[j]; toplamArray[j] = toplamArray[j + 1]; toplamArray[j + 1] = temp; } } } // 降序排序后,第N大元素直接取索引n-1 int fifthLargest = toplamArray[4]; // 第5大对应索引4
内容的提问来源于stack exchange,提问作者Metin Selman Irmak
相关产品推荐
相关产品推荐

