Полагаю, следуйте приведенному выше «оптимальному алгоритму, использующему n + log n-2 сравнений», код, который я придумал и не использует двоичное дерево для хранения значения, будет следующим:
Во время каждого рекурсивного вызова размер массива уменьшается вдвое.
Таким образом, число сравнений равно:
1-я итерация: n / 2 сравнения
2-я итерация:n / 4 сравнения
3-я итерация: n / 8 сравнений
... До записи n итераций?
Следовательно, всего => n - 1 сравнений?
function findSecondLargestInArray(array) {
let winner = [];
if (array.length === 2) {
if (array[0] < array[1]) {
return array[0];
} else {
return array[1];
}
}
for (let i = 1; i <= Math.floor(array.length / 2); i++) {
if (array[2 * i - 1] > array[2 * i - 2]) {
winner.push(array[2 * i - 1]);
} else {
winner.push(array[2 * i - 2]);
}
}
return findSecondLargestInArray(winner);
}
Предполагая, что массив содержит 2 ^ n чисел.
Если существует 6 чисел, то 3 числа перейдут на следующий уровень, что не так.
Нужно как 8 цифр => 4 числа => 2 числа => 1 число => 2 ^ n число числа