Коротко, ты можешь не сохранять минимальное и максимальное значение отдельно, т.к. они всегда доступны по индексу в массиве. Другое дело - это что у тебя нет этих индексов до начала прохода по массиву, тебе их просто неоткуда взять. Этот момент и определяет верное начальное состояние в решении твоей задачи. Отсутствие этого момента и приводит к тому, что твой код сейчас работает неверно.
Тебе нужны только индексы тех элементов, которые ты считаешь как минимальный и максимальный.
size_t min_value_index = 0;
size_t max_value_index = 0;
Я выбираю инициализацию в
0
для того чтобы изначально обозначить первый же элемент массива и как минимальный, и как максимальный одновременно. Именно так я определю начальное состояние алгоритма.
Далее надо сделать проход по массиву.
for( size_t index = 1; index < stream_length; ++index )
{
// ...
}
Мне незачем сравнивать элемент по нулевому индексу с самим собой, т.к. я изначально уже выбрал его, поэтому проход по массиву можно начать со следующего элемента.
Теперь надо записать условие выбора минимального и максимального значений.
for( size_t index = 1; index < stream_length; ++index )
{
if( stream[ index ] < stream[ min_value_index ] )
{
min_value_index = index;
}
if( stream[ index ] > stream[ max_value_index ] )
{
max_value_index = index;
}
}
При записи условий очень важно соблюдать логику. Нужно писать так, чтобы выражение читалось как можно легче, используя слова в названиях и порядок записи операций.
Тут видно что если по текущему индексу значение меньше запомненного минимального, то надо запомнить текущий индекс как индекс минимального значения. И для максимального значения точно так же.
По завершении цикла в
min_value_index
будет гарантированно лежать индекс минимального значения массива, а в
max_value_index
- индекс максимального.
Как работает этот код.