Не настраивайте алгоритмы.Алгоритм понятен («найди минимум»).Вместо этого измените критерии поиска и оставайтесь в области O (n).
Код.
#include <algorithm>
#include <vector>
#include <iostream>
int main () {
// std::min_element()
std::vector<float> vec;
vec.push_back(0);
vec.push_back(-1);
vec.push_back(-2);
vec.push_back(2);
vec.push_back(4);
auto cmp = [](float lhs, float rhs) {
const bool lz = lhs < 0,
rz = rhs < 0;
if (lz && rz) return lhs < rhs;
if (lz) return false;
if (rz) return true;
return lhs < rhs;
};
const float mp = *std::min_element (vec.begin(), vec.end(), cmp);
std::cout << mp << '\n';
// demonstration of our comparison
sort (vec.begin(), vec.end(), cmp);
for (auto it=vec.begin(), end=vec.end(); it!=end; ++it)
std::cout << *it << " ";
std::cout << std::endl;
}
Выход.
0
0 2 4 -1 -2
Объяснение.
Наша функция сортировки закодирована в cmp
.Он проверяет знаки своих операндов.Если оба отрицательны, побеждает больший.Если только LHS является отрицательным, тогда RHS автоматически предпочтительнее при сортировке.Наоборот, если RHS является отрицательным, LHS является предпочтительным.Оба они положительны, мы возвращаемся к нормальному порядку.
Приятно то, что это выполняется ровно один раз в диапазоне и в O (n).