16 ответов:
это не самый гламурный способ, но работает.
(должно быть
using System.Linq;)int maxValue = anArray.Max(); int maxIndex = anArray.ToList().IndexOf(maxValue);
int[] anArray = { 1, 5, 2, 7 }; // Finding max int m = anArray.Max(); // Positioning max int p = Array.IndexOf(anArray, m);
если индекс не отсортирован, вы должны пройти через массив хотя бы один раз, чтобы найти самое высокое значение. Я бы использовал простой
forпетли:int? maxVal = null; //nullable so this works even if you have all super-low negatives int index = -1; for (int i = 0; i < anArray.Length; i++) { int thisNum = anArray[i]; if (!maxVal.HasValue || thisNum > maxVal.Value) { maxVal = thisNum; index = i; } }это более подробно, чем что-то с помощью LINQ или других однострочных решений, но это, вероятно, немного быстрее. На самом деле нет способа сделать это быстрее, чем O(N).
обязательный LINQ one[1]-liner:
var max = anArray.Select((value, index) => new {value, index}) .OrderByDescending(vi => vi.value) .First();(сортировка, вероятно, является хитом производительности по сравнению с другими решениями.)
[1]: для заданных значений "один".
здесь два подхода. Вы можете добавить обработку, когда массив пуст.
public static void FindMax() { // Advantages: // * Functional approach // * Compact code // Cons: // * We are indexing into the array twice at each step // * The Range and IEnumerable add a bit of overhead // * Many people will find this code harder to understand int[] array = { 1, 5, 2, 7 }; int maxIndex = Enumerable.Range(0, array.Length).Aggregate((max, i) => array[max] > array[i] ? max : i); int maxInt = array[maxIndex]; Console.WriteLine($"Maximum int {maxInt} is found at index {maxIndex}"); } public static void FindMax2() { // Advantages: // * Near-optimal performance int[] array = { 1, 5, 2, 7 }; int maxIndex = -1; int maxInt = Int32.MinValue; // Modern C# compilers optimize the case where we put array.Length in the condition for (int i = 0; i < array.Length; i++) { int value = array[i]; if (value > maxInt) { maxInt = value; maxIndex = i; } } Console.WriteLine($"Maximum int {maxInt} is found at index {maxIndex}"); }
int[] numbers = new int[7]{45,67,23,45,19,85,64}; int smallest = numbers[0]; for (int index = 0; index < numbers.Length; index++) { if (numbers[index] < smallest) smallest = numbers[index]; } Console.WriteLine(smallest);
public static void Main() { int a,b=0; int []arr={1, 2, 2, 3, 3, 4, 5, 6, 5, 7, 7, 7, 100, 8, 1}; for(int i=arr.Length-1 ; i>-1 ; i--) { a = arr[i]; if(a > b) { b=a; } } Console.WriteLine(b); }
выход на код ниже:
00: 00:00.3279270-max1 00: 00: 00.2615935-max2 00: 00: 00.6010360-max3 (arr.Макс ())
С 100000000 ints в массиве не очень большая разница, но все же...
class Program { static void Main(string[] args) { int[] arr = new int[100000000]; Random randNum = new Random(); for (int i = 0; i < arr.Length; i++) { arr[i] = randNum.Next(-100000000, 100000000); } Stopwatch stopwatch1 = new Stopwatch(); Stopwatch stopwatch2 = new Stopwatch(); Stopwatch stopwatch3 = new Stopwatch(); stopwatch1.Start(); var max = GetMaxFullIterate(arr); Debug.WriteLine( stopwatch1.Elapsed.ToString()); stopwatch2.Start(); var max2 = GetMaxPartialIterate(arr); Debug.WriteLine( stopwatch2.Elapsed.ToString()); stopwatch3.Start(); var max3 = arr.Max(); Debug.WriteLine(stopwatch3.Elapsed.ToString()); } private static int GetMaxPartialIterate(int[] arr) { var max = arr[0]; var idx = 0; for (int i = arr.Length / 2; i < arr.Length; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[idx] > max) { max = arr[idx]; } idx++; } return max; } private static int GetMaxFullIterate(int[] arr) { var max = arr[0]; for (int i = 0; i < arr.Length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }
public static class ArrayExtensions { public static int MaxIndexOf<T>(this T[] input) { var max = input.Max(); int index = Array.IndexOf(input, max); return index; } }это работает для всех типов переменных...
var array = new int[]{1, 2, 4, 10, 0, 2}; var index = array.MaxIndexOf(); var array = new double[]{1.0, 2.0, 4.0, 10.0, 0.0, 2.0}; var index = array.MaxIndexOf();
рассмотрим следующее:
/// <summary> /// Returns max value /// </summary> /// <param name="arr">array to search in</param> /// <param name="index">index of the max value</param> /// <returns>max value</returns> public static int MaxAt(int[] arr, out int index) { index = -1; int max = Int32.MinValue; for (int i = 0; i < arr.Length; i++) { if (arr[i] > max) { max = arr[i]; index = i; } } return max; }использование:
int m, at; m = Max(new int[]{1,2,7,3,4,5,6}, out at); Console.WriteLine("Max: {0}, found at: {1}", m, at);
вот решение LINQ, которое является O( n) с приличными постоянными факторами:
int[] anArray = { 1, 5, 2, 7, 1 }; int index = 0; int maxIndex = 0; var max = anArray.Aggregate( (oldMax, element) => { ++index; if (element <= oldMax) return oldMax; maxIndex = index; return element; } ); Console.WriteLine("max = {0}, maxIndex = {1}", max, maxIndex);но вы действительно должны написать явное
forЛОП, если вы заботитесь о производительности.
просто еще одна перспектива с помощью
DataTable. ОбъявитьDataTableС 2 столбцами под названиемindexиval. Добавьте и какAutoIncrementSeedиAutoIncrementStepзначения1до
краткий однострочный:
var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();тест:
var anArray = new int[] { 1, 5, 2, 7 }; var max = anArray.Select((n, i) => (Number: n, Index: i)).Max(); Console.WriteLine($"Maximum number = {max.Number}, on index {max.Index}."); // Maximum number = 7, on index 4.характеристики:
- использует Linq (не так оптимизирован, как ваниль, но компромисс меньше кода).
- сортировать не нужно.
- вычислительная сложность: O (n).
- сложность пространства: O (n).
находит самое большое и самое маленькое число в массиве:
int[] arr = new int[] {35,28,20,89,63,45,12}; int big = 0; int little = 0; for (int i = 0; i < arr.Length; i++) { Console.WriteLine(arr[i]); if (arr[i] > arr[0]) { big = arr[i]; } else { little = arr[i]; } } Console.WriteLine("most big number inside of array is " + big); Console.WriteLine("most little number inside of array is " + little);
Comments