Как найти максимальное значение числа

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Excel 2007 Еще…Меньше

Предположим, вы хотите узнать, у кого самый маленький показатель погрешности в производственной цехе или самая большая заработная плата в вашем отделе. Существует несколько способов вычисления наименьшего или наибольшего числа в диапазоне.

Если ячейки находятся в соединимой строке или столбце

  1. Вы можете выбрать ячейку снизу или справа от чисел, для которых нужно найти наименьшее число.

  2. На вкладке Главная в группе Редактирование щелкните стрелку рядом с кнопкой Изображение кнопки, выберите min (вычисляет наименьшее) или Max (вычисляет наибольшее) и нажмите клавишу ВВОД.

Если ячейки не находятся в подрядной строке или столбце

Для этого используйте функции МИН, МАКС, МАЛЫЙ или БОЛЬШОЙ.

Пример

Скопируйте следующие данные на пустой лист.

1

2

3

4

5

6

7

A

Данные

10

7

9

27

0

4

Формула

Описание (результат)

=МИН(A2:A7)

Наименьшее число в диапазоне (0)

=МАКС(A2:A7)

Наибольшее число в диапазоне (27)

=МАЛЫЙ(A2:A7; 2)

Второе наименьшее число в диапазоне (4)

=БОЛЬШОЙ(A2:A7;3)

Третье по величине число в диапазоне (9)

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

См. также

НАИБОЛЬШИЙ

MAX

MIN

НАИМЕНЬШИЙ

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Skip to content

Функция МАКС в Excel: как найти максимальное значение

В этой статье объясняется функция МАКС с множеством примеров формул, которые показывают, как найти наибольшее значение в Excel и выделить наибольшее число на листе.

МАКС – одна из самых простых и простых в использовании функций Excel. Тем не менее, у нее есть несколько хитростей, которые дадут вам большие возможности. Скажите, как вы используете функцию МАКС с условиями? Или знаете, как извлечь абсолютное наибольшее значение? Мы предложим несколько решений для этих и других аналогичных задач.

  • Функция МАКС — основные сведения
  • Найти максимальное в группе чисел
  • Вычисляем максимум в несмежных диапазонах
  • Как получить максимальную (последнюю) дату
  • Максимальное значение с условиями
  • Наибольшее число без учёта нулей
  • Как найти максимальное число игнорируя ошибки
  • Определяем абсолютное максимальное значение
  • Максимум применительно к тексту
  • Вычисление наибольшей разницы
  • Выводим адрес ячейки с максимальным значением
  • Как выделить цветом самое большое число
  • Почему не получается?

Функция МАКС

Функция МАКС в Excel возвращает наибольшее значение в указанном вами наборе данных.

Синтаксис у неё следующий:

МАКС(число1; [число2];…)

Где число может быть представлено числовым значением, массивом, именованным диапазоном, ссылкой на ячейку или диапазоном, содержащим числа.

Число1 является обязательным, число2 и последующие аргументы необязательны.

Чтобы создать самую простую формулу, чтобы выбрать максимальное значение в таблице Excel, вы можете вводить числа непосредственно в список аргументов, например:

=МАКС(1; 2; 3)

На практике это – очень редкий случай. По большей части вы будете иметь дело с диапазонами и ячейками.

Самый быстрый способ найти наибольшее значение в диапазоне, – это:

  1. В ячейке введите = МАКС(
  2. Выберите диапазон чисел с помощью мыши.
  3. Введите закрывающую скобку.
  4. Жмём Enter для завершения.

Например, чтобы найти максимальное значение в диапазоне A1: A6, формула будет выглядеть следующим образом:

=МАКС(A1:A6)

Если ваши числа находятся в непрерывном диапазоне (как в этом примере), вы можете заставить Excel автоматически создать формулу МАКС. Вот как:

  1. Выделите ячейки со своими числами.
  2. На вкладке «Главная» в группе «Форматы» нажмите «Автосумма» и выберите «Максимум» из раскрывающегося списка.

5 фактов, которые нужно знать о функции МАКС –

  1. В текущих версиях Excel она может обрабатывать до 255 аргументов.
  2. Если аргументы не содержат ни одного числа, возвращается ноль.
  3. Если аргументы содержат одно или несколько значений ошибки, возвращается ошибка.
  4. Пустые ячейки игнорируются.
  5. Обрабатываются логические значения и текстовые представления чисел, предоставленные непосредственно в списке аргументов (ИСТИНА приравнивается к 1, ЛОЖЬ – к 0). Если используется ссылка на ячейку с логическим или текстовым значением, то они игнорируются.

Как найти в Excel наибольшее число – примеры.

Ниже мы покажем несколько стандартных вариантов использования функции МАКС. 

Во многих случаях существует несколько различных решений для одной и той же задачи, поэтому я рекомендую вам протестировать все варианты, чтобы выбрать наиболее подходящий.

Как выбрать максимальное значение в группе чисел.

Чтобы в Excel извлечь наибольшее число в группе чисел, передайте эту группу функции МАКС в качестве ссылки на диапазон. Диапазон может содержать любое количество строк и столбцов. Например, чтобы получить максимальное значение из C2: E7, используйте эту простую формулу:

=МАКС(C2:E7)

Предположим, у нас есть сведения об учениках с их оценкой, но некоторые из значений оценки являются логическими, текстовыми, а некоторые пока вовсе не имеют оценки.

Применим функцию:

 = МАКС(B2:B10)

Как видите, игнорируются ячейки с текстом, а также пустые, логические значения приравниваются к нулю, а затем вычисляется максимальное число, как показано в таблице Excel выше.

Наибольшее значение в несмежных ячейках или диапазонах Excel

Чтобы осуществить поиск в несмежных ячейках и диапазонах, необходимо включить в формулу ссылку на каждый отдельный адрес. Рассмотрим пошагово:

  1. Начните вводить функцию МАКС в ячейку.
  2. После того, как вы ввели открывающую скобку, нажмите и удерживайте Ctrl  и выберите мышкой нужные ячейки и диапазоны.
  3. Отпустите Ctrl и введите закрывающую круглую скобку.
  4. Нажмите Enter.

Вы получите формулу максимального числа в Excel, подобную этому:

=МАКС(C2:E2;C7:E7)

Как получить наибольшую (последнюю) дату в Excel

Во внутренней системе Excel даты – это не что иное, как порядковые номера дней, поэтому функция МАКС обрабатывает их без проблем.

Например, чтобы найти последнюю дату доставки из C2: C7, запишите обычную формулу, которую вы использовали бы для чисел:

=МАКС(C2:C7)

Поскольку дата – это также число, всё работает замечательно.

Максимальное значение с условиями.

Довольно часто случается, что из большого объёма данных Excel нужно выбрать максимальное значение из какой-то его части. К примеру, найти самую большую партию какого-то определённого товара в огромном списке продаж. Или же найти наивысшую оценку по какому-то предмету среди большого набора данных оценок, набранных учащимися определенного класса по нескольким предметам в школе.

Если вы хотите получить максимальное значение Excel с учётом каких-то условий, то вы можете выбрать из нескольких предложенных ниже формул. Чтобы убедиться, что все они возвращают одинаковый результат, мы протестируем их на одном и том же наборе данных.

Задача: мы хотим найти самую большую продажу для определенного товара, указанного в F1.

МАКС + ЕСЛИ

Если вы ищете решение, которое работает во всех версиях Excel, используйте функцию ЕСЛИ для проверки условия, а затем передайте полученный массив в функцию:

=МАКС(ЕСЛИ(B2:B15=F1; C2:C15))

Чтобы это работало, необходимо нажать Ctrl + Shift + Enter одновременно, чтобы ввести как формулу массива. Если все сделано правильно, Excel заключит ваше выражение в {фигурные скобки}, что является визуальным указанием на формулу массива.

Также можно оценить несколько условий одновременно, о чем мы поговорим далее.

МАКС + СУММПРОИЗВ

Если вам не нравится использовать формулы массива в ваших листах, объедините МАКС с функцией СУММПРОИЗВ, которая умеет работать с массивами:

=СУММПРОИЗВ(МАКС((B2:B15=F1)*(C2:C15)))

МАКСЕСЛИ

В Excel 2019 и Office 365 есть специальная функция МАКСЕСЛИ, которая предназначена для поиска наибольшего значения по 126 критериям.

В нашем случае используется только одно условие, поэтому формула очень проста:

=МАКСЕСЛИ(C2:C15;B2:B15;F1)

На приведенном ниже скриншоте показаны все 3 формулы в действии:

Выбираем максимальное значение в Excel без учета нулей

Фактически, это разновидность условного МАКС, рассмотренного в предыдущем примере. Чтобы исключить нули, используйте логический оператор «не равно» и поместите выражение «<> 0» либо в критерий функции МАКСЕСЛИ, либо в конструкцию МАКС + ЕСЛИ.

Как вы понимаете, проверка этого условия имеет смысл только в случае наличия отрицательных чисел. Для положительных чисел эта проверка излишняя, потому что любое положительное число больше нуля.

Чтобы попробовать, давайте найдем самую маленькую скидку в диапазоне C2:C7. Поскольку все скидки представлены отрицательными числами, наименьшая скидка фактически является наибольшим значением.

Обязательно нажмите Ctrl + Shift + Enter, чтобы правильно заполнить эту формулу массива:

=МАКС(ЕСЛИ(C2:C7<>0; C2:C7))

А это обычная формула –

=МАКСЕСЛИ(C2:C7;C2:C7;”<>0″)

И вот что у нас получилось:

Как найти максимальное значение, игнорируя ошибки

Когда вы работаете с большим объемом данных, управляемых различными формулами, есть вероятность, что некоторые из них приведут к ошибкам. Соответственно, функция МАКС тоже вернет ошибку.

В качестве обходного пути можно использовать МАКС вместе с ЕОШИБКА. Учитывая, что вы ищете в диапазоне A1: B5, формула принимает следующую форму:

=МАКС(ЕСЛИ(ЕОШИБКА(A1:B6); “”; A1:B6))

Чтобы упростить формулу, используйте функцию ЕСЛИОШИБКА вместо комбинации ЕСЛИ + ЕОШИБКА. Это также сделает логику более очевидной – если есть ошибка в A1:B6, замените ее пустой строкой (”), а затем вычислите самое большое значение в диапазоне:

=МАКС(ЕСЛИОШИБКА(A1:B6; “”))

Неудобство состоит в том, что нужно не забывать нажимать Ctrl + Shift + Enter, потому что это работает только как формула массива.

В Excel 2019 и Office 365 функция МАКСЕСЛИ может быть хорошим решением при условии, что ваш набор данных содержит хотя бы одно положительное число или нулевое значение:

=МАКСЕСЛИ(A1:B6;A1:B6;”>=0″)

Поскольку формула выполняет поиск максимального значения с условием «больше или равно 0», она не будет работать для набора данных, состоящего исключительно из отрицательных чисел.

Также идеально подходит функция АГРЕГАТ, которая может выполнять ряд операций и игнорировать значения ошибок:

=АГРЕГАТ(4;6;A1:B6)

Число 4 в первом аргументе предписывает выполнить поиск максимального числа, шестёрка во втором аргументе – это параметр «игнорировать ошибки», а A1: B6 – ваш целевой диапазон.

Все формулы возвращают одинаковый результат:

Как найти абсолютное наибольшее значение в Excel

При работе с диапазоном положительных и отрицательных чисел иногда может потребоваться найти максимальное абсолютное значение независимо от знака.

Первая идея, которая приходит в голову, – получить абсолютные значения всех чисел в диапазоне с помощью функции ABS и передать их в МАКС:

{= МАКС(ABS( диапазон ))}

Это формула массива, поэтому не забудьте подтвердить ее с помощью Ctrl + Shift + Enter. Еще одно предостережение: он работает только с числами и приводит к ошибке в случае нечисловых данных.

Не нравится это решение? Тогда давайте построим что-нибудь более жизнеспособное 🙂

Что, если мы найдем минимальное значение, изменим или проигнорируем его знак, а затем вычислим вместе со всеми другими числами? Да, это будет отлично работать как обычная формула. В качестве дополнительного бонуса это отлично обрабатывает текстовые записи и ошибки.

С исходными данными в A1: B5 расчёты выглядят следующим образом.

Формула массива (заполняется с помощью Ctrl + Shift + Enter):

=МАКС(ABS(A1:B5))

Обычная формула (заполняется клавишей Enter):

=МАКС(МАКС(A1:B5); -МИН(A1:B5))

или же

=МАКС(МАКС(A1:B5); ABS(МИН(A1:B5)))

На скриншоте ниже показаны результаты:

Вернуть максимальное абсолютное значение с сохранением знака

В некоторых ситуациях может потребоваться найти наибольшее абсолютное значение в таблице Excel, но вернуть число с исходным знаком, а не его абсолютное значение.

Предполагая, что числа находятся в ячейках A1: B5, вот выражение, которое следует использовать:

=ЕСЛИ(ABS(МАКС(A1:B5))>ABS(МИН(A1:B5)); МАКС(A1:B5);МИН(A1:B5))

Сложная на первый взгляд логика довольно проста. Сначала вы находите наибольшее и наименьшее числа в диапазоне и сравниваете их абсолютные значения. Если абсолютное (без учёта знака) максимальное значение больше абсолютного минимального значения, возвращается это наиболшее число, иначе – наименьшее число. 

Поскольку формула возвращает исходное, а не абсолютное значение, информация о знаке сохраняется (см. скриншот выше).

Максимальное значение применительно к тексту.

Предположим, у нас есть список имен, и нам нужно вычислить их максимальную длину, то есть найти наибольшее количество символов в ячейке Excel.

Здесь мы должны применить функцию ДЛСТР для вычисления длины имени.

=ДЛСТР(А2)

А затем  применим функцию МАКС, чтобы узнать максимальную длину ФИО.

=МАКС(B2;B13)

А можно обойтись без дополнительного столбца и вычислить максимальную длину текстового значения в одной ячейке. Для этого нужно объединить эти формулы, вложив ДЛСТР в МАКС:

=МАКС(ДЛСТР(A2:A13))

Учтите, что это формула массива. Ведь можно работать не только с диапазоном, но и с массивом числовых значений, который формируется другой функцией.

Вычислить наибольшую разницу в сумме.

Предположим, нам нужно вычислить наибольшую разницу в сумме за любой смежный месяц для каждого товара. Или, выражаясь иначе, найти максимальное изменение продаж за месяц.

 Ниже представлена ​​таблица Excel с небольшой выборкой данных за 4 месяца.

Если решать проблему «в лоб», то можно использовать функцию ЕСЛИ со множеством условий:

=ЕСЛИ(И((МАКС(B2:C2)-МИН(B2:C2))>(МАКС(C2:D2)-МИН(C2:D2)),  (МАКС(B2:C2)-МИН(B2:C2))>(МАКС(D2:E2)-МИН(D2:E2))), МАКС(B2:C2)-МИН(B2:C2), ЕСЛИ((МАКС(C2:D2)-МИН(C2:D2))>(МАКС(D2:E2)-МИН(D2:E2)), МАКС(C2:D2)-МИН(C2:D2),МАКС(D2:E2)-МИН(D2:E2)))

Но при помощи функции МАКС можно значительно упростить расчет и не пользоваться такой длинной и сложной конструкцией.

Используя функцию ABS, мы будем искать максимальное изменение вне зависимости от знака. Попробуйте заменить большую формулу этой:

=МАКС(ABS(B2-C2);ABS(C2-D2);ABS(D2-E2))

Как вы можете видеть в таблице ниже, этот вариант намного проще и возвращает те же результаты.

Как найти адрес ячейки Excel с максимальным числом.

Есть ли решение, которое сообщит адрес ячейки с наибольшим числом, а не само число? То есть, если A4 равно 9 и это значение является самым большим, как мне составить формулу, которая возвратит координаты A4 вместо 9?

Вы можете использовать функции ЯЧЕЙКА , ИНДЕКС и ПОИСКПОЗ в сочетании с функцией МАКС, чтобы вернуть адрес ячейки с наибольшим значением.

Например, если вы хотите найти ячейку с наивысшим значением в столбце от А1 до А7, вы можете использовать следующий расчёт:

=ЯЧЕЙКА(“адрес”;ИНДЕКС(A1:A7;ПОИСКПОЗ(МАКС(A1:A7);A1:A7;0)))

Получаем результат в виде абсолютной ссылки $А$4, которая указывает на самое большое число из этого диапазона.

Однако учтите, что это выражение работает только с одним столбцом.

А вот еще альтернативные варианты поиска адреса наибольшего числа по столбцу, из которых вы можете выбрать наиболее подходящий для себя:

Формула массива –

{=АДРЕС(ПОИСКПОЗ(МАКС(F1:F7);F1:F7;0);СТОЛБЕЦ(F1:F7);4)}

Обычная формула, в которой явным образом нужно указать столбец:

=”F”&ПОИСКПОЗ(МАКС(F1:F7);F1:F7;0)

Ещё одна формула массива –

{=ЯЧЕЙКА(“address”;ИНДЕКС(F2:F7;ПОИСКПОЗ(МАКС(F2:F7);F2:F7;0)))}

На скриншоте вы видите, что все они возвращают один и тот же адрес:

И ещё одна формула массива для вывода адреса, которая работает с диапазоном из нескольких строк и столбцов:

{=АДРЕС(МАКС(ЕСЛИ((C2:E7=МАКС(C2:E7));СТРОКА(C2:E7))); МАКС(ЕСЛИ((C2:E7=МАКС(C2:E7));СТОЛБЕЦ(C2:E7))))}

В данном случае, как видите, мы ищем адрес наибольшего числа в двумерном диапазоне C2:E7.

Напомню, что формула массива вводится с использованием комбинации клавиш Ctrl + Shift + Enter.

Как выделить наибольшее значение в Excel

В ситуации, когда вы хотите определить самое большое число в исходном наборе данных, самый быстрый способ – выделить его с помощью условного форматирования Excel. Приведенные ниже примеры покажут вам два разных варианта действий.

Выделите максимальное число в диапазоне Excel

В Microsoft Excel есть встроенное правило для форматирования максимальных чисел в диапазоне, которое идеально соответствует нашим потребностям. Вот как можно применить его:

  1. Выберите диапазон чисел (в нашем случае C2: E8).
  2. На вкладке «Главная» в группе «Стили» щелкните «Условное форматирование»> «Новое правило».
  3. В диалоговом окне «Новое правило форматирования» выберите «Форматировать только первые или последние значения».
  4. На нижней панели выберите «первым» из раскрывающегося списка и введите 1 в поле рядом с ним (это означает, что вы хотите выделить только одну ячейку, содержащую наибольшее значение).
  5. Нажмите кнопку «Формат» и выберите стиль оформления.
  6. Дважды щелкните OK, чтобы закрыть оба окна.

Как выделить цветом максимальное число в каждой строке

Поскольку нет встроенного правила, чтобы выделить наибольшее значение из каждой строки таблицы Excel, вам придется настроить собственное на основе функции МАКС. Вот как:

  1. Выберите все строки, которые вы хотите проверить (C3:E8).
  2. Кликните Новое правило > Использовать формулу.
  3. В поле Форматировать значения, запишите:

=C3=МАКС($C3:$E3)

Где C3 – крайняя верхняя левая ячейка, а $C3:$E3 – координаты первой строки. Чтобы правило работало, обязательно зафиксируйте координаты столбца в диапазоне знаком $.

  1. Нажмите кнопку «Формат» и выберите нужный формат.
  2. Дважды щелкните ОК.

Кончик. Таким же образом вы можете выделить максимальное значение в каждом столбце. Шаги в точности такие же, за исключением того, что вы пишете условие для диапазона первого столбца и фиксируете координаты строки:

=C2=МАКС(C$2:C$7)

Дополнительные сведения см. в статье « Как создать правило условного форматирования на основе формул» .

Почему не получается найти наибольшее число?

МАКС – одна из самых простых в использовании функций Excel. Если вопреки всем ожиданиям она не работает, то, скорее всего, это одна из следующих проблем:

МАКС возвращает ноль

Если обычная формула МАКС возвращает 0, даже если в указанном диапазоне есть числа явно большие, скорее всего, эти числа отформатированы как текст. 

Это особенно актуально, когда вы запускаете функцию МАКС для данных, получаемых другими формулами или же импортированных из других программ. 

Вы можете проверить это с помощью функции ЕЧИСЛО, например:

=ЕЧИСЛО(A1)

Если приведенная выше формула возвращает ЛОЖЬ, то значение в A1 не является числовым. Это означает, что вы должны устранять неполадки с исходными данными, а не с формулой.

МАКС возвращает значение #Н/Д, #ЗНАЧ или другую ошибку.

Пожалуйста, внимательно проверьте указанные ячейки. Если какая-либо из указанных ячеек содержит ошибку, поиск максимума приведет к той же ошибке. Чтобы обойти это, посмотрите, как получить максимальное значение, игнорируя все ошибки .

Вот как можно найти максимальное значение в Excel. Благодарю вас за чтение!

Функция ЕСЛИОШИБКА – примеры формул В статье описано, как использовать функцию ЕСЛИОШИБКА в Excel для обнаружения ошибок и замены их пустой ячейкой, другим значением или определённым сообщением. Покажем примеры, как использовать функцию ЕСЛИОШИБКА с функциями визуального…
Сравнение ячеек в Excel Вы узнаете, как сравнивать значения в ячейках Excel на предмет точного совпадения или без учета регистра. Мы предложим вам несколько формул для сопоставления двух ячеек по их значениям, длине или количеству…
проверка правильности ввода Excel при помощи функции ЕСЛИ Как проверить правильность ввода данных в Excel? Подтверждаем правильность ввода галочкой. Задача: При ручном вводе данных в ячейки таблицы проверять правильность ввода в соответствии с имеющимся списком допустимых значений. В случае правильного ввода в отдельном столбце ставить…
ЕСЛИ + СОВПАД текст Функция ЕСЛИ: проверяем условия с текстом Рассмотрим использование функции ЕСЛИ в Excel в том случае, если в ячейке находится текст. СодержаниеПроверяем условие для полного совпадения текста.ЕСЛИ + СОВПАДИспользование функции ЕСЛИ с частичным совпадением текста.ЕСЛИ + ПОИСКЕСЛИ…
функция если Визуализация данных при помощи функции ЕСЛИ Функцию ЕСЛИ можно использовать для вставки в таблицу символов, которые наглядно показывают происходящие с данными изменения. К примеру, мы хотим показать в отдельной колонке таблицы, происходит рост или снижение продаж.…
ЕСЛИ с датами 3 примера, как функция ЕСЛИ работает с датами. На первый взгляд может показаться, что функцию ЕСЛИ для работы с датами можно применять так же, как для числовых и текстовых значений, которые мы только что обсудили. К сожалению, это…

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 Tynjala's user avatar

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 Bellaire's user avatar

Adam BellaireAdam Bellaire

107k19 gold badges148 silver badges163 bronze badges

If

  1. The array is not sorted
  2. 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.

Steven Payne's user avatar

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

Eclipse's user avatar

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

Rumen Georgiev's user avatar

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 Afshari's user avatar

Mehrdad AfshariMehrdad Afshari

412k90 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

jauboux's user avatar

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

Nick's user avatar

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

martinus's user avatar

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 Brubaker's user avatar

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

sajan's user avatar

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 Kumar's user avatar

Ajay KumarAjay Kumar

4,6481 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

Peter's user avatar

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

Nimeshika Prabodhani's user avatar

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 Belair's user avatar

Eric BelairEric Belair

10.6k13 gold badges75 silver badges116 bronze badges

В этой статье мы рассмотрим сравнение чисел.

При сравнении чисел мы выбираем то число, которое банально больше. Ну, например, при сравнении числа 2 и 3 мы выберем максимальным числом 3, а минимальным 2. Графически 3 на числовой оси X находится правее, чем 2.

Я покажу один из самых рациональных алгоритмов выбора максимального и минимального числа, подходящего для общего случая. Это присвоение для переменных, выражающих минимальное и максимальное значение, значение одного из элементов заданных чисел/массива.

Ну теперь перейдем к практике.

Простая программка для сравнения 3 чисел(min_max_1):

Program Min_Max;
var a,b,c,min,max:integer;
begin
write(‘Введите 3 числа для сравнения (через пробел) : ‘);read(a,b,c);
min:=a;max:=a;
if b>max then max:=b;if b<min then min:=b;
if c>max then max:=c;if c<min then min:=c;
writeln(‘Максимальное число : ‘,max);
writeln(‘Минимальное число : ‘,min);
readln;
end.

Теперь подробнее.

var a,b,c,min,max:integer;

Ну смысл этой строки понятен, если хотите, можете выразить переменные через тип real, но особой разницы нету.

write(‘Введите 3 числа для сравнения (через пробел): ‘);read(a,b,c);

Мы вводим три числа через пробел, т.к. здесь оператор write.

min:=a;max:=a;

Здесь мы присваиваем переменным min и max значение одного из введенных чисел, если вы хотите разнообразия, то можете вместо переменной a написать b или c.

if b>max then max:=b; if b<min then min:=b;
if c>max then max:=c; if c<min then min:=c;

Здесь происходит сравнение оставшихся введенных переменные со значениями переменных min и max.

writeln(‘Максимальное число : ‘,max);
writeln(‘Минимальное число : ‘,min);

Ну здесь у нас происходит вывод ответа, думаю, объяснять где, какое значение выводится не надо=)

readln;

Это используется для того, чтобы мы увидели результат программы.

end.

Ну собственно логическое завершение программы=)

Дополнение:

  1. Кто хочет, чтобы экран самоочищался от результатов каждый раз, может добавить в начале программы

Uses crt;

и

Begin clrscr;

Самый распространенный вариант реализации функции max — проверка знака выражения a - b. В этом случае мы не можем использовать оператор сравнения, но можем использовать умножение.

Примечание Смысл задачи не в том, чтобы скрыть сравнение или условие в какую-нибудь стандартную функцию типа abs() или стандартный оператор типа целочисленного деления, а в том, чтобы всё это сделать вообще без инструкций ветвления на уровне процессора.

Обозначим знак выражения a - b как k. Если a - b >= 0, то k = 1, иначе k = 0. Пусть q будет инвертированным значением k.

Код будет иметь вид:

/* Отражаем 1 в 0 и 0 в 1 */
int flip(int bit) {
	return 1^bit;
}

/* Возвращаем 1, если число положительное, и 0, если отрицательное*/
int sign(int a) {
	return flip((a >> (sizeof(int) * CHAR_BIT - 1)))) & 0x1);
}

int getMaxNaive(int a, int b) {
	int k = sign(a - b);
	int q = flip(k);
	return a * k + b * q;
}

Это почти работоспособный код (можете проверить). Проблемы начинаются при переполнении. Предположим, что a = INT_MAX - 2 и b = -15. В этом случае a - b перестанет помещаться в INT_MAX и вызовет переполнение (значение станет отрицательным).

Можно использовать тот же подход, но придумать другую реализацию. Нам нужно, чтобы выполнялось условие k = 1, когда a > b. Для этого придется использовать более сложную логику.

Когда возникает переполнение a - b? Только тогда, когда a положительное число, а b отрицательное (или наоборот). Трудно обнаружить факт переполнения, но мы в состоянии понять, что a и b имеют разные знаки. Если у а и b разные знаки, то пусть k = sign(a).

Логика будет следующей:

1. если у a и b разные знаки:
// если a > 0, то b < 0 и k = 1.
// если a < 0, то b > 0 и k = 0.
// так или иначе, k = sign(a)
2. пусть k = sign(a)
3. иначе пусть k = sign(a - b) // переполнение невозможно

Приведенный далее код реализует этот алгоритм, используя умножение вместо операторов сравнения (проверить):

int getMax(int a, int b) {
	int c = a - b;
	
	int sa = sign(a); // если a >= 0, то 1, иначе 0
	int sb = sign(b); // если a >= 1, то 1, иначе 0
	int sc = sign(c); // зависит от переполнения a - b
	
	/* Цель: найти k, которое = 1, если а > b, и 0, если a < b.
	 * если a = b, k не имеет значения */

	// Если у а и b равные знаки, то k = sign(a)
	int use_sign_of_a = sa ^ sb;
	
	// Если у a и b одинаковый знак, то k = sign(a - b)
	int use_sign_of_c = flip(sa ^ sb);
	
	int k = use_sign_of_a * sa + use_sign_of_c * sc;
	int q = flip(k); // отражение k

	return a * k + b * q;
}

Отметим, что для большей наглядности мы разделяем код на методы и вводим переменные. Это не самый компактный или эффективный способ написания кода, но так мы делаем код понятнее.

Разбор взят из книги Гейл Л. Макдауэлл «Cracking the Coding Interview» (есть в переводе).

Добавить комментарий