アルゴリズムを調整しないでください。アルゴリズムは明確です(「最小値を見つける」)。代わりに検索条件を調整し、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)で1回だけ実行されることです。