Какой подход использовать при поиске минимального и максимального значения в массиве? - PullRequest
0 голосов
/ 22 января 2019

Интересно, как лучше всего найти минимальное и максимальное значение в массиве?Я использую два подхода (мой массив a с размером size):

Подход 1:

int min = 0, max = 0;
for(int i = 0; i < size; i++)
{
    if(a[i] > max || i == 0) max = a[i];
    if(a[i] < min || i == 0) min = a[i];
}

Подход 2:

int min = INT_MAX, max = INT_MIN;
for(int i = 0; i < size; i++)
{
    if(a[i] > max) max = a[i];
    if(a[i] < min) min = a[i];
}

Подход 3:

int min = a[0], max = a[0];
for(int i = 1; i < size; i++)
{
    if(a[i] > max) max = a[i];
    if(a[i] < min) min = a[i];
}

Подход 2 кажется немного более оптимальным для моего глаза новичка (нам не нужно оценивать i == 0 2 раза за каждую итерацию цикла. Однако я боюсь, что играю с этими предельными значениямиможет пойти не так. Однако это решается в подходе 3. Какой из трех наиболее оптимальный и почему?

Спасибо за все ответы!

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Попробуйте перейти на 3-й вариант.Это более оптимально, и тогда вам не нужно иметь дело со значениями пределов.

0 голосов
/ 22 января 2019

Подход 1 подходит для всех случаев, поэтому, если вы пишете код без учета особого контекста, я бы использовал его.

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

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

Мне нравится эта модификация подхода 3:

// assuming size is of size_t and can't be negative
int min = size ? a[0] : 0;
int max = min;
for(int i = 1; i < size; i++)
{
    if(a[i] > max) max = a[i];
    if(a[i] < min) min = a[i];
}

UPD

Я действительно удивлен, когда люди думают, что Подход 1 не будет работать с отрицательными числами. Это будет , потому что на первой итерации, когда проверяется i==0, мы всегда инициируем min и max с первым элементом. В случае сомнений я рекомендую запускать этот код в отрицательной последовательности - он работает (я проверял)

0 голосов
/ 22 января 2019

2-й и 3-й подходы - лучшие подходы.Лично я считаю, что третье решение лучше, чем второе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...