Задачи по нахождению минимального и/или максимального элемента в массиве очень часто встречаются в различных учебных пособиях по программированию и, как правило, вызывают трудности у начинающих программистов или просто студентов, получивших такое задание.
В данной статье вы узнаете, как написать реализацию программы на языке C++, которая находит максимальный и минимальный элемент в массиве и выводит на экран. А узнать множество решений других задач можно в разделе с решениями задач по программированию на языке C++.
Что такое максимальный и минимальный элемент массива
Для начала поймем, что же такое максимальный или минимальный элемент в массиве? Всё просто, максимальный элемент массива — это элемент, который имеет самое большое числовое значение, а минимальный элемент массива — это элемент, имеющий самое маленькое значение.
Пример: в массиве, состоящем из таких элементов: 3, 1, 0, -4, 16, 2 — максимальный элемент равен 16, т.к. это число больше других, а минимальный элемент равен -4, т.к. оно меньше остальных.
Поняв это, можно приступить к решению задачи.
Алгоритм решения задачи
— Инициализация массива, переменных, хранящих минимальное и максимальное значение.
— Заполнение массива случайными числами при помощи цикла и функции, возвращающей случайные числа.
— Вывод массива.
— Сравнение каждого элемента массива: Если элемент больше переменной с максимальным значением, то значение записывается в переменную; Если элемент меньше переменной с минимальным значением, то значение записывается в переменную.
— Вывод переменных с максимальным и минимальным элементом.
Алгоритм решения на языке C++
Для начала нужно подключить заголовок ввода/вывода <iostream>, заголовок стандартных функций <cstdlib> в ней имеется функция rand(), которая позволит заполнить массив случайными числами. Заполнение каждого элемента массива вручную требует времени, его можно сэкономить автоматизировав процесс. Подключаем пространство имён std. Создаём константу N, она будет определять количество элементов в массиве.
#include <iostream> #include <cstdlib> using namespace std; //Пространство имён std const int N = 10;//Количество элементов в массиве int main() { return 0; }
В теле функции main() инициализируем массив целых чисел из N лементов, целочисленные переменные max и min, они будут хранить значение максимального и минимального элементов массива соответственно.
int mass[N], max, min;
Теперь заполним массив случайными числами. Для этого используем цикл от 0 до N (не включительно), который пройдется по каждому элементу массива и поместит случайное значение от 0 до 98. Это можно сделать, использовав функцию rand(), которая возвращает случайное число. Поделить возвращаемое значение на 99 и внести в ячейку остаток от деления, таким образом значение ячейки будет иметь значение в диапазоне от 0 до 99(не включая 99, т.к. остаток от деления не может быть кратным делителю). При этом выведем значения элементов массива на экран.
cout << "Элементы: |"; for(int r = 0; r<N; r++) // Цикл от 0 до N { mass[r] = rand()%99; // Заполнение случайным числом cout << mass[r] << "|"; // Вывод значения } cout << endl;
В результате программа выведет на экран значения элементов массива, разделенное вертикальными чертами:
Элементы: |28|43|72|79|23|70|55|39|69|1|
Обратите внимание! Если вы программируете под Windows и у Вас не отображаются русские символы в консоли, то советую Вам почитать о решении этой проблемы в статье Русские символы(буквы) при вводе/выводе в консоль на C++.
Далее определим максимальный и минимальный элемент в массиве, для этого вновь пройдемся по массиву циклом. При помощи условия определим максимальный и минимальный элемент массива.
Перед циклом нужно будет занести первый элемент массива в переменные min и max, они будут хранить минимальное и максимальное значение изначально, а во время цикла поменяют его, если найдётся значение меньше для min или больше для max.
max = mass[0];//Помещаем значения 1-го элемента min = mass[0];//массива в переменные for(int r = 1; r<N; r++) { if(max < mass[r]) max = mass[r]; //если значение элемента больше значения переменной max, то записываем это значение в переменную if(min > mass[r]) min = mass[r]; //аналогично и для min }
После цикла выведем значения min и max.
cout << "Min: " << min << endl; cout << "Max: " << max << endl;
После компиляции и запуска прогамма выводит следующее
Элементы: |28|43|72|79|23|70|55|39|69|1| Min: 1 Max: 79
Пробегаемся по элементам массива глазами и видим, что минимальное значение — 1, а максимальное — 79. Переменные min и max имеют эти же значения соответственно, следовательно алгоритм работает.
Весь листинг программы на C++
#include <iostream> #include <cstdlib> using namespace std; const int N = 10; int main() { int mass[N], max, min; cout << "Элементы: |"; for(int r = 0; r<N; r++) { mass[r] = rand()%99; cout << mass[r] << "|"; } cout << endl; max = mass[0]; min = mass[0]; for(int r = 1; r<N; r++) { if(max < mass[r]) max = mass[r]; if(min > mass[r]) min = mass[r]; } cout << "Min: " << min << endl; cout << "Max: " << max << endl; return 0; }
На чтение 3 мин Просмотров 200 Опубликовано 18.04.2023
Содержание
- Введение
- Метод sort()
- Метод sorted()
- Циклом for
- Функция max()
- Заключение
Введение
В данной статье рассмотрим четыре способа для поиска максимального значения в списке в Python.
Метод sort()
Как мы знаем, метод sort() сортирует упорядоченные коллекции элементов по возрастанию. Однако, если мы добавим параметр reverse, то сможем отсортировать список по убыванию. После такой сортировки максимальный элемент списка будет находиться по индексу 0:
new_list = [6, 10, 5, 2, 7]
new_list.sort(reverse=True)
print(f'Максимальный элемент в списке: {new_list[0]}')
# Вывод: Максимальное число в списке: 10
Метод sorted()
Данный способ работает по той же методике, что и предыдущий. Различие лишь в том, что мы будем использовать функцию sorted():
new_list = [6, 10, 5, 2, 7]
new_list = sorted(new_list, reverse=True)
print(f'Максимальный элемент в списке: {new_list[0]}')
# Вывод: Максимальное число в списке: 10
Циклом for
Мы можем определить максимальное число в списке при помощи цикла for. Для этого создадим переменную max_number, и сохраним в неё значение первого элемента списка:
new_list = [6, 10, 5, 2, 7]
max_number = new_list[0]
Далее создадим цикл, в котором пройдёмся по всему списку new_list. Внутри цикла зададим условие, что если итерабельное значение больше max_number, то меняем значение в max_number на итерабельное:
new_list = [6, 10, 5, 2, 7]
max_number = new_list[0]
for i in new_list:
if i > max_number:
max_number = i
print(f'Максимальное число в списке: {max_number}')
# Вывод: Максимальный элемент в списке: 10
Функция max()
В Python существует встроенная функция, которая позволяет находить максимальное значение в списке, кортеже и т.д.
Сохраним значение максимального элемента в списке, и выведем его:
new_list = [6, 10, 5, 2, 7]
max_number = max(new_list)
print(f'Максимальное число в списке: {max_number}')
# Вывод: Максимальное число в списке: 10
Заключение
В ходе статьи мы с Вами разобрали целых четыре способа нахождения максимального элемента в списке Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
Какой алгоритм для поиска максимума в случайном массиве использовать? В статье собрано 5 эффективных must-have алгоритмов.
Если хочешь подтянуть свои знания, загляни на наш курс «Алгоритмы и структуры данных», на котором ты:
- углубишься в решение практических задач;
- узнаешь все про сложные алгоритмы, сортировки, сжатие данных и многое другое.
Ты также будешь на связи с преподавателем и другими студентами.
В итоге будешь браться за сложные проекты и повысишь чек за свою работу 🙂
Интересно, хочу попробовать
Самый быстрый и простейший алгоритм
Следует пояснить, что под «быстротой» алгоритма будет подразумеваться его асимптотическая сложность, а не физическое время выполнения.
В действительности, единственный способ точно найти самое большое число в случайном массиве будет перебор каждого числа в поисках максимума. Поэтому сложность такого алгоритма – O(N). Они называются линейными.
Простейшая реализация алгоритма на С:
#include <stdio.h> int main() { int array[100]; int maximum, size, index = 0; printf("Введите длину массива (не больше 100)n"); scanf("%d", &size); printf("Введите %d целых чисел массиваn", size); for (int i = 0; i < size; i++) scanf("%d", &array[i]); maximum = array[0]; // За изначальный максимум берем первый элемент массива for (int i = 1; i < size; i++) { if (array[i] > maximum) { maximum = array[i]; index = i; } } printf("Максимум находится в позиции %d и его значение %d.n", index, maximum); return 0; }
А как насчет распараллеливания?
После прочтения абзаца выше многие могут предложить поиск максимума с помощью параллельных вычислений, потому что он будет быстрее. И это так, если мы говорим о физическом времени. Но несмотря на то, сколько у вас есть процессов, вам всё равно придется просмотреть каждый элемент массива. Сложность алгоритма остается такой же, O(N).
Рассмотрим ситуацию на примере. Есть 200 карточек, на каждой из которых случайное число. Ваша задача найти карточку с самым большим числом. Допустим, друг согласился помочь, забрав половину карточек. Теперь каждый из вас ищет максимум из 100 карточек, вместо 200. Как только вы оба закончите, останется сравнить максимумы обеих половин. Время сократилось вдвое, но просмотреть пришлось все 200 карточек.
Сама по себе задача является так называемой чрезвычайно параллельной задачей, что ещё раз подтверждает возможность её решения именно распараллеливанием, без ущерба для конечного результата.
Задача о разборчивой невесте
Есть ещё один вариант нахождения максимума в случайном массиве.
Идем по первой половине всех значений в массиве. Запоминаем самое большое. Назовём его Х. Далее проходим по второй половине. Когда (и если) находим значение, которое больше Х, останавливаемся. Обозначим его Y. Какова вероятность того, что Y – максимум в массиве?
Чтобы это утверждение было истинным, Y должно находиться во второй половине массива. А так как значения в массиве случайны, шанс такого = 50%. Тогда если второй максимум присутствует в первой половине, это гарантирует, что найден правильный максимум.
Вероятность, что второй максимум в первой половине также = 50%. Посему вероятность, что и второй максимум в первой половине, и первый максимум во второй половине, равна 25%.
В итоге, такой алгоритм гарантирует точность 25% в нахождении максимума в массиве случайных чисел. Можно улучшить алгоритм, если искать второй максимум не в первой половине (1/2), а в 1/e (основание натурального логарифма) части массива. Этот способ впервые был предложен для решения задачи о разборчивой невесте или задачи секретаря (The Secretary Problem).
Аналоговый алгоритм
Спагетти-сортировка — прекрасный аналоговый алгоритм для решения задачи нахождения максимума в массиве.
Представим, что в массиве только N целых чисел. Возьмите N не приготовленных палочек спагетти, длина каждой сопоставляется с единственным значением в массиве.
Соберите спагетти в руку. Аккуратно, чтобы не сломать, поставьте горсть на ровную поверхность. В результате выше всех будет видна самая длинная (максимум) соломинка.
Асимптотическая сложность такого алгоритма – O(1). Но в цифровом мире он не применим.
Квантовый алгоритм
Алгоритм Гровера (или схема Гровера) используется в квантовых вычислениях для решения задач перебора. С его помощью сложность поиска максимума уменьшается до O(sqrt(N)) (большая О от корня N).
Данный способ решения может быть применен только на квантовом компьютере, что сильно умаляет его полезность в современном мире, но его нельзя не упомянуть.
Источник
Хотите дополнить? Ждём ваши предложения в комментариях
В этой статье мы научимся находить максимальное значение в списке на Python. Для всестороннего понимания вопроса мы рассмотрим использование некоторых встроенных функций, простые подходы, а также небольшие реализации известных алгоритмов.
Сначала давайте вкратце рассмотрим, что такое список в Python и как найти в нем максимальное значение или просто наибольшее число.
В Python есть встроенный тип данных под названием список (list). По своей сути он сильно напоминает массив. Но в отличие от последнего данные внутри списка могут быть любого типа (необязательно одного): он может содержать целые числа, строки или значения с плавающей точкой, или даже другие списки.
Хранимые в списке данные определяются как разделенные запятыми значения, заключенные в квадратные скобки. Списки можно определять, используя любое имя переменной, а затем присваивая ей различные значения в квадратных скобках. Он является упорядоченным, изменяемым и допускает дублирование значений. Например:
list1 = ["Виктор", "Артем", "Роман"]
list2 = [16, 78, 32, 67]
list3 = ["яблоко", "манго", 16, "вишня", 3.4]
Далее мы рассмотрим возможные варианты кода на Python, реализующего поиск наибольшего элемента в списке, состоящем из сравниваемых элементов. В наших примерах будут использоваться следующие методы/функции:
- Встроенная функция
max()
- Метод грубой силы (перебора)
- Функция
reduce()
- Алгоритм Heap Queue (очередь с приоритетом)
- Функция
sort()
- Функция
sorted()
- Метод хвостовой рекурсии
№1 Нахождение максимального значения с помощью функции max()
Это самый простой и понятный подход к поиску наибольшего элемента. Функция Python max()
возвращает самый большой элемент итерабельного объекта. Ее также можно использовать для поиска максимального значения между двумя или более параметрами.
В приведенном ниже примере список передается функции max в качестве аргумента.
list1 = [3, 2, 8, 5, 10, 6]
max_number = max(list1)
print("Наибольшее число:", max_number)
Наибольшее число: 10
Если элементы списка являются строками, то сначала они упорядочиваются в алфавитном порядке, а затем возвращается наибольшая строка.
list1 = ["Виктор", "Артем", "Роман"]
max_string = max(list1, key=len)
print("Самая длинная строка:", max_string)
Самая длинная строка: Виктор
№2 Поиск максимального значения перебором
Это самая простая реализация, но она немного медленнее, чем функция max()
, поскольку мы используем этот алгоритм в цикле.
В примере выше для поиска максимального значения нами была определена функция large()
. Она принимает список в качестве единственного аргумента. Для сохранения найденного значения мы используем переменную max_
, которой изначально присваивается первый элемент списка. В цикле for каждый элемент сравнивается с этой переменной. Если он больше max_
, то мы сохраняем значение этого элемента в нашей переменной. После сравнения со всеми членами списка в max_
гарантировано находится наибольший элемент.
def large(arr):
max_ = arr[0]
for ele in arr:
if ele > max_:
max_ = ele
return max_
list1 = [1,4,5,2,6]
result = large(list1)
print(result) # вернется 6
№3 Нахождение максимального значения с помощью функции reduce()
В функциональных языках reduce()
является важной и очень полезной функцией. В Python 3 функция reduce()
перенесена в отдельный модуль стандартной библиотеки под названием functools. Это решение было принято, чтобы поощрить разработчиков использовать циклы, так как они более читабельны. Рассмотрим приведенный ниже пример использования reduce()
двумя разными способами.
В этом варианте reduce()
принимает два параметра. Первый — ключевое слово max, которое означает поиск максимального числа, а второй аргумент — итерабельный объект.
from functools import reduce
list1 = [-1, 3, 7, 99, 0]
print(reduce(max, list1)) # вывод: 99
Другое решение показывает интересную конструкцию с использованием лямбда-функции. Функция reduce()
принимает в качестве аргумента лямбда-функцию, а та в свою очередь получает на вход условие и список для проверки максимального значения.
from functools import reduce
list1 = [-1, 3, 7, 99, 0]
print(reduce(lambda x, y: x if x > y else y, list1)) # -> 99
№4 Поиск максимального значения с помощью приоритетной очереди
Heapq — очень полезный модуль для реализации минимальной очереди. Если быть более точным, он предоставляет реализацию алгоритма очереди с приоритетом на основе кучи, известного как heapq. Важным свойством такой кучи является то, что ее наименьший элемент всегда будет корневым элементом. В приведенном примере мы используем функцию heapq.nlargest()
для нахождения максимального значения.
import heapq
list1 = [-1, 3, 7, 99, 0]
print(heapq.nlargest(1, list1)) # -> [99]
Приведенный выше пример импортирует модуль heapq и принимает на вход список. Функция принимает n=1
в качестве первого аргумента, так как нам нужно найти одно максимальное значение, а вторым аргументом является наш список.
№5 Нахождение максимального значения с помощью функции sort()
Этот метод использует функцию sort()
для поиска наибольшего элемента. Он принимает на вход список значений, затем сортирует его в порядке возрастания и выводит последний элемент списка. Последним элементом в списке является list[-1]
.
list1 = [10, 20, 4, 45, 99]
list1.sort()
print("Наибольшее число:", list1[-1])
Наибольшее число: 99
№6 Нахождение максимального значения с помощью функции sorted()
Этот метод использует функцию sorted()
для поиска наибольшего элемента. В качестве входных данных он принимает список значений. Затем функция sorted()
сортирует список в порядке возрастания и выводит наибольшее число.
list1=[1,4,22,41,5,2]
sorted_list = sorted(list1)
result = sorted_list[-1]
print(result) # -> 41
№7 Поиск максимального значения с помощью хвостовой рекурсии
Этот метод не очень удобен, и иногда программисты считают его бесполезным. Данное решение использует рекурсию, и поэтому его довольно сложно быстро понять. Кроме того, такая программа очень медленная и требует много памяти. Это происходит потому, что в отличие от чистых функциональных языков, Python не оптимизирован для хвостовой рекурсии, что приводит к созданию множества стековых фреймов: по одному для каждого вызова функции.
def find_max(arr, max_=None):
if max_ is None:
max_ = arr.pop()
current = arr.pop()
if current > max_:
max_ = current
if arr:
return find_max(arr, max_)
return max_
list1=[1,2,3,4,2]
result = find_max(list1)
print(result) # -> 4
Заключение
В этой статье мы научились находить максимальное значение из заданного списка с помощью нескольких встроенных функций, таких как max()
, sort()
, reduce()
, sorted()
и других алгоритмов. Мы написали свои код, чтобы попробовать метод перебора, хвостовой рекурсии и алгоритма приоритетной очереди.
The theoretical answers from everyone else are all neat, but let’s be pragmatic. ActionScript provides the tools you need so that you don’t even have to write a loop in this case!
First, note that Math.min()
and Math.max()
can take any number of arguments. Also, it’s important to understand the apply()
method available to Function
objects. It allows you to pass arguments to the function using an Array
. Let’s take advantage of both:
var myArray:Array = [2,3,3,4,2,2,5,6,7,2];
var maxValue:Number = Math.max.apply(null, myArray);
var minValue:Number = Math.min.apply(null, myArray);
Here’s the best part: the «loop» is actually run using native code (inside Flash Player), so it’s faster than searching for the minimum or maximum value using a pure ActionScript loop.
answered Jan 8, 2009 at 23:51
Josh TynjalaJosh Tynjala
5,2253 gold badges23 silver badges25 bronze badges
4
There isn’t any reliable way to get the minimum/maximum without testing every value. You don’t want to try a sort or anything like that, walking through the array is O(n), which is better than any sort algorithm can do in the general case.
answered Jan 8, 2009 at 16:00
Adam BellaireAdam Bellaire
107k19 gold badges148 silver badges163 bronze badges
If
- The array is not sorted
- Finding the min and max is done simultaneously
Then there is an algorithm that finds the min and max in 3n/2 number of comparisons. What one needs to do is process the elements of the array in pairs. The larger of the pair should be compared with the current max and the smaller of the pair should be compared with the current min. Also, one needs take special care if the array contains odd number of elements.
In c++ code (borrowing some code from Mehrdad).
struct MinMax{
int Min,Max;
}
MinMax FindMinMax(int[] array, int start, int end) {
MinMax min_max;
int index;
int n = end - start + 1;//n: the number of elements to be sorted, assuming n>0
if ( n%2 != 0 ){// if n is odd
min_max.Min = array[start];
min_max.Max = array[start];
index = start + 1;
}
else{// n is even
if ( array[start] < array[start+1] ){
min_max.Min = array[start];
min_max.Max = array[start+1];
}
else{
min_max.Min = array[start+1];
min_max.Max = array[start];
}
index = start + 2;
}
int big, small;
for ( int i = index; i < n-1; i = i+2 ){
if ( array[i] < array[i+1] ){ //one comparison
small = array[i];
big = array[i+1];
}
else{
small = array[i+1];
big = array[i];
}
if ( min_max.Min > small ){ //one comparison
min_max.Min = small;
}
if ( min_max.Max < big ){ //one comparison
min_max.Max = big;
}
}
return min_max;
}
It’s very easy to see that the number of comparisons it takes is 3n/2. The loop runs n/2 times and in each iteration 3 comparisons are performed. This is probably the optimum one can achieve. At this moment, I cannot point to a definite source of that. (But, I think I have seen a proof of that somewhere.)
The recursive solution given by Mehrdad above, probably also achieves this minimal number of comparisons (the last line needs to be changed). But with the same number of comparisons an iterative solution will always beat a recursive solution due to overhead in the function call as he mentioned. However, if one only cares about finding min and max of a few numbers (as Eric Belair does), no one will notice any difference in todays computer with any of the approaches above. For a large array, the difference could be significant.
Though this solution and the solution given by Matthew Brubaker has O(n) complexity, in practice one should carefully asses the hidden constants involved. The number of comparisons in his solution is 2n. The speedup gained with the solution with 3n/2 comparisons as opposed to 2n comparisons would be noticeable.
answered Jul 26, 2009 at 7:41
2
Unless the array is sorted, that’s the best you’re going to get. If it is sorted, just take the first and last elements.
Of course, if it’s not sorted, then sorting first and grabbing the first and last is guaranteed to be less efficient than just looping through once. Even the best sorting algorithms have to look at each element more than once (an average of O(log N) times for each element. That’s O(N*Log N) total. A simple scan once through is only O(N).
If you are wanting quick access to the largest element in a data structure, take a look at heaps for an efficient way to keep objects in some sort of order.
answered Jan 8, 2009 at 16:10
EclipseEclipse
44.6k20 gold badges112 silver badges170 bronze badges
9
You have to loop through the array, no other way to check all elements. Just one correction for the code — if all elements are negative, maxValue will be 0 at the end. You should initialize it with the minimum possible value for integer.
And if you are going to search the array many times it’s a good idea to sort it first, than searching is faster (binary search) and minimum and maximum elements are just the first and the last.
answered Jan 8, 2009 at 16:03
1
Depends on what you call «best.» From a theoretical point of view, you cannot solve the problem in less than O(n)
in a deterministic Turing machine.
The naive algorithm is too loop and update min, max. However, a recursive solution will require less comparisons than naive algorithm, if you want to get min, max simultaneously (it isn’t necessarily faster due to function call overhead).
struct MinMax{
public int Min,Max;
}
MinMax FindMinMax(int[] array, int start, int end) {
if (start == end)
return new MinMax { Min = array[start], Max = array[start] };
if (start == end - 1)
return new MinMax { Min = Math.Min(array[start], array[end]), Max = Math.Max(array[start], array[end]) } ;
MinMax res1 = FindMinMax(array, start, (start + end)/2);
MinMax res2 = FindMinMax(array, (start+end)/2+1, end);
return new MinMax { Min = Math.Min(res1.Min, res2.Min), Max = Math.Max(res1.Max, res2.Max) } ;
}
The simplest solution would be to sort and get the first and last item, though it’s obviously not the fastest
The best solution, performance-wise, to find the minimum or maximum is the naive algorithm you written (with a single loop).
answered Jan 8, 2009 at 16:06
Mehrdad AfshariMehrdad Afshari
413k90 gold badges850 silver badges788 bronze badges
9
Math.max() is actually as3 code compiled to AVM2 opcodes, and as such is not more «native» than any other as3 code. As a consequence, it is not necessarily the fastest implementation.
Actually, given that it works on Array type, it is slower than carefully written code usign Vector:
I did a quick benchmark comparison of several naive Vector and Array implementations of Math.max, using gskinner’s PerformanceTest (Vector and Array being filled with identical random Numbers).
The fastest Vector implementation appeared to be more than 3x faster than Math.max with recent AIR SDK/release player (flash player WIN 14,0,0,122 RELEASE, compiled with AIR SDK 14):
average 3.5 ms for 1,000,000 values, compared to Math.max() average of 11ms :
function max(values:Vector.<Number>):Number
{
var max:Number = Number.MIN_VALUE;
var length:uint = values.length;
for (var i:uint = 0; i < length ; ++i)
if (values[i] > max)
max = values[i];
return max;
}
Conclusion is that if you are concerned by performance, you should use Vector over Array anywhere you can in the first place, and not always rely on default implementations, especially when they force the use of Array
PS:same implementation with a for each() loop is 12x slower …!
answered Aug 27, 2014 at 13:47
jaubouxjauboux
8886 silver badges12 bronze badges
This depends on real world application requirements.
If your question is merely hypothetical, then the basics have already been explained. It is a typical search vs. sort problem. It has already been mentioned that algorithmically you are not going to achieve better than O(n) for that case.
However, if you are looking at practical use, things get more interesting. You would then need to consider how large the array is, and the processes involved in adding and removing from the data set. In these cases, it can be best to take the computational ‘hit’ at insertion / removal time by sorting on the fly. Insertions into a pre-sorted array are not that expensive.
The quickest query response to the Min Max request will always be from a sorted array, because as others have mentioned, you simply take the first or last element — giving you an O(1) cost.
For a bit more of a technical explanation on the computational costs involved, and Big O notation, check out the Wikipedia article here.
Nick.
answered Jan 8, 2009 at 16:18
NickNick
2,2852 gold badges14 silver badges26 bronze badges
If you are building the array once and want to find the maximum just once, iterating is the best you can do.
When you want to modify the array and occasionally want to know the maximum element, you should use a Priority Queue. One of the best data structures for that is a Fibonacci Heap, if this is too complicated use a Binary Heap which is slower but still good.
To find minimum and maximum, just build two heaps and change the sign of the numbers in one of them.
answered Jan 8, 2009 at 16:12
martinusmartinus
17.7k15 gold badges72 silver badges92 bronze badges
Please take into account that sorting the array will only be faster that looping up to certain size of the array. If your array is small (and it will be like that any time) then your solution is perfectly fine. But if it might get too large you should use a conditional to use the sort approach when the array is small, and the normal iteration when it is too large
answered Jan 28, 2009 at 21:21
If you want to find both the min and max at the same time, the loop can be modified as follows:
int min = int.maxValue;
int max = int.minValue;
foreach num in someArray {
if(num < min)
min = num;
if(num > max)
max = num;
}
This should get achieve O(n) timing.
answered Jan 8, 2009 at 16:29
Matthew BrubakerMatthew Brubaker
3,0971 gold badge21 silver badges18 bronze badges
Shortest way :
Math.min.apply(null,array); //this will return min value from array
Math.max.apply(null,array); //this will return max value from array
otherway of getting min & max value from array
function maxVal(givenArray):Number
{
var max = givenArray[0];
for (var ma:int = 0; ma<givenArray.length; ma++)
{
if (givenArray[ma] > max)
{
max = givenArray[ma];
}
}
return max;
}
function minVal(givenArray):Number
{
var min = givenArray[0];
for (var mi:int = 0; mi<givenArray.length; mi++)
{
if (givenArray[mi] < min)
{
min = givenArray[mi];
}
}
return min;
}
As you can see, the code in both of these functions is very similar. The function sets a variable — max (or min) and then runs through the array with a loop, checking each next element. If the next element is higher than the current, set it to max (or min). In the end, return the number.
answered Feb 6, 2014 at 3:39
sajansajan
1,3451 gold badge14 silver badges18 bronze badges
Below is Solution with o(n):-
public static void findMaxAndMinValue(int A[]){
int min =0, max = 0;
if(A[0] > A[1] ){
min = A[1];
max = A[0];
}else{
max = A[1];
min = A[0];
}
for(int i = 2;i<A.length ;i++){
if(A[i] > max){
max = A[i];
}
if(min > A[i]){
min = A[i];
}
}
System.out.println("Maxinum Value is "+min+" & Minimum Value is "+max);
}
answered Jun 17, 2015 at 18:06
Ajay KumarAjay Kumar
4,6881 gold badge38 silver badges42 bronze badges
Amazed no-one mentioned parallelism here.
If you got really a huge array, you can use parallel-for, on sub ranges.
In the end compare all sub-ranges.
But parallelism comes width some penalty too, so this would not optimize on small arrays. However if you got huge datasets it starts to make sense, and you get a time division reduction nearing the amount of threads performing the test.
answered Mar 21, 2018 at 9:26
PeterPeter
2,0071 gold badge20 silver badges45 bronze badges
Find max values from a array
Let’s see how to obtain min, max values by using a single funtion
public void findMaxValue(){
int[] my_array = {1,2,,6,5,8,3,9,0,23};
int max = my_array[0];
for(int i=1; i<my_array.length; i++)
{
if(my_array[i] > max)
max = my_array[i];
}
return max;
}
same thing can do for find min value
answered Oct 24, 2018 at 16:00
After reading everyone’s comments (thank you for your interest), I found that the «best» way (least amount of code, best performing) to do this was to simply sort the Array, and then grab the first value in the Array:
var myArray:Array /* of Number */ = [2,3,3,4,2,2,5,6,7,2];
myArray.sort(Array.NUMERIC);
var minValue:int = myArray[0];
This also works for an Array of Objects — you simply use the Array.sortOn() function and specify a property:
// Sample data
var myArray:Array /* of XML */ =
[
<item level="2" name="a" />
<item level="3" name="b" />
<item level="3" name="c" />
<item level="2" name="d" />
<item level="5" name="e" />
]
// Perform a descending sort on the specified attribute in Array to get the maximum value
myArray.sortOn("@level", Array.DESCENDING | Array.NUMERIC);
var lowestLevel:int = myArray[0].@level;
I hope this helps someone else someday!
answered Jan 23, 2009 at 22:34
Eric BelairEric Belair
10.6k13 gold badges75 silver badges116 bronze badges