алгоритм Никфа не лучший способ сделать это. В худшем случае алгоритм Никфа выполняет 2 сравнения на число, в общей сложности 2n - 2.
Мы можем сделать немного лучше. Когда вы сравниваете два элемента a и b, если a> b, мы знаем, что a не является минимумом, а b не является максимумом. Таким образом, мы используем всю доступную информацию, чтобы исключить как можно больше элементов. Для простоты предположим, что у нас есть четное количество элементов.
Разбейте их на пары: (a1, a2), (a3, a4) и т. Д.
Сравните их, разбив их на наборы победителей и проигравших - для этого потребуется n / 2 сравнений, что даст нам два набора размера n / 2. Теперь найдите максимум победителей и минимум проигравших.
Сверху, поиск минимума или максимума из n элементов занимает n-1 сравнений. Таким образом, среда выполнения:
n / 2 (для начальных сравнений) + n / 2 - 1 (максимум победителей) + n / 2 - 1 (минимум проигравших) = n / 2 + n / 2 + n / 2 -2 = 3n / 2 - 2. Если n нечетно, у нас есть еще один элемент в каждом из наборов, поэтому время выполнения будет 3n / 2
Фактически, мы можем доказать, что это самое быстрое, что эта проблема может быть решена любым алгоритмом.
Пример:
Предположим, наш массив 1, 5, 2, 3, 1, 8, 4
Разделите на пары: (1,5), (2,3) (1,8), (4, -).
Сравните. Победители: (5, 3, 8, 4). Проигравшие (1, 2, 1, 4).
Сканирование победителей дает 8. Сканирование проигравших дает 1.