Если
- Массив не отсортирован
- Нахождение минимума и максимума выполняется одновременно
Тогда есть алгоритм, который находит минимальное и максимальное значения в 3n / 2 числах сравнений. Что нужно сделать, это обработать элементы массива в парах. Большее из пары следует сравнивать с текущим значением max, а меньшее из пары следует сравнивать с текущим значением min. Кроме того, необходимо соблюдать особую осторожность, если массив содержит нечетное количество элементов.
В коде c ++ (заимствование некоторого кода из 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;
}
Очень легко увидеть, что для сравнения требуется 3n / 2. Цикл выполняется n / 2 раза, и в каждой итерации выполняется 3 сравнения. Это, вероятно, оптимальный результат, которого можно достичь. В данный момент я не могу указать на определенный источник этого. (Но я думаю, что где-то видел это доказательство.)
Рекурсивное решение, данное Мехрдадом выше, вероятно, также достигает этого минимального числа сравнений (последнюю строку необходимо изменить). Но при одинаковом количестве сравнений итеративное решение всегда побеждает рекурсивное решение из-за накладных расходов при вызове функции, как он упоминал. Однако, если кто-то заботится только о поиске минимума и максимума из нескольких чисел (как это делает Эрик Белэр), никто не заметит никакой разницы в сегодняшнем компьютере с любым из описанных выше подходов. Для большого массива разница может быть значительной.
Хотя это решение и решение, данное Мэтью Брубейкером, имеют O (n) сложность, на практике следует тщательно оценивать задействованные скрытые константы. Количество сравнений в его решении составляет 2n. Ускорение, полученное благодаря решению с 3n / 2 сравнениями, в отличие от 2n сравнений, будет заметно.