「🏗️」 wip(ex02): algo is basically done now i think ? just need some optimisations iirc
This commit is contained in:
@@ -33,19 +33,22 @@ std::vector<size_t> generateJacobsthal(size_t n)
|
|||||||
return seq;
|
return seq;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename Container, typename T>
|
||||||
struct Pair {
|
typename Container::iterator binaryInsertPosition(Container &c, const T &value)
|
||||||
T first;
|
{
|
||||||
T second;
|
typename Container::iterator first = c.begin();
|
||||||
};
|
typename Container::iterator last = c.end();
|
||||||
|
|
||||||
template <typename T>
|
while (first < last)
|
||||||
struct PairComp {
|
{
|
||||||
bool operator()(const Pair<T> &x, const Pair<T> &y) const
|
typename Container::iterator mid = first + (last - first) / 2; //tzvetan told me a better way iirc but i don't remember D:
|
||||||
{
|
if (*mid < value)
|
||||||
return x.second < y.second;
|
first = mid + 1;
|
||||||
|
else
|
||||||
|
last = mid;
|
||||||
}
|
}
|
||||||
};
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
Container fordJohnsonSort(const Container &input)
|
Container fordJohnsonSort(const Container &input)
|
||||||
@@ -56,7 +59,7 @@ Container fordJohnsonSort(const Container &input)
|
|||||||
if (input.size() <= 1)
|
if (input.size() <= 1)
|
||||||
return input;
|
return input;
|
||||||
|
|
||||||
std::vector<Pair<T> > pairs;
|
std::vector<std::pair<T, T> > pairs;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (; i + 1 < input.size(); i += 2)
|
for (; i + 1 < input.size(); i += 2)
|
||||||
{
|
{
|
||||||
@@ -64,16 +67,16 @@ Container fordJohnsonSort(const Container &input)
|
|||||||
T b = input[i+1];
|
T b = input[i+1];
|
||||||
if (a > b)
|
if (a > b)
|
||||||
std::swap(a, b);
|
std::swap(a, b);
|
||||||
Pair<T> p;
|
|
||||||
p.first = a;
|
pairs.push_back(std::make_pair(a, b));
|
||||||
p.second = b;
|
|
||||||
pairs.push_back(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(pairs.begin(), pairs.end(), PairComp<T>());
|
Container larger;
|
||||||
|
for (size_t j = 0; j < pairs.size(); ++j)
|
||||||
|
larger.push_back(pairs[j].second);
|
||||||
|
|
||||||
for (size_t k = 0; k < pairs.size(); ++k)
|
larger = fordJohnsonSort(larger);
|
||||||
result.push_back(pairs[k].second);
|
result = larger;
|
||||||
|
|
||||||
std::vector<size_t> order = generateJacobsthal(pairs.size());
|
std::vector<size_t> order = generateJacobsthal(pairs.size());
|
||||||
std::vector<bool> inserted(pairs.size(), false);
|
std::vector<bool> inserted(pairs.size(), false);
|
||||||
@@ -83,8 +86,7 @@ Container fordJohnsonSort(const Container &input)
|
|||||||
size_t j = order[idx];
|
size_t j = order[idx];
|
||||||
if (j < pairs.size() && !inserted[j])
|
if (j < pairs.size() && !inserted[j])
|
||||||
{
|
{
|
||||||
typename Container::iterator pos = std::lower_bound(
|
typename Container::iterator pos = binaryInsertPosition(result, pairs[j].first);
|
||||||
result.begin(), result.end(), pairs[j].first);
|
|
||||||
result.insert(pos, pairs[j].first);
|
result.insert(pos, pairs[j].first);
|
||||||
inserted[j] = true;
|
inserted[j] = true;
|
||||||
}
|
}
|
||||||
@@ -94,8 +96,7 @@ Container fordJohnsonSort(const Container &input)
|
|||||||
{
|
{
|
||||||
if (!inserted[j])
|
if (!inserted[j])
|
||||||
{
|
{
|
||||||
typename Container::iterator pos = std::lower_bound(
|
typename Container::iterator pos = binaryInsertPosition(result, pairs[j].first);
|
||||||
result.begin(), result.end(), pairs[j].first);
|
|
||||||
result.insert(pos, pairs[j].first);
|
result.insert(pos, pairs[j].first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,7 +104,7 @@ Container fordJohnsonSort(const Container &input)
|
|||||||
if (i < input.size())
|
if (i < input.size())
|
||||||
{
|
{
|
||||||
T leftover = input[i];
|
T leftover = input[i];
|
||||||
typename Container::iterator pos = std::lower_bound(result.begin(), result.end(), leftover);
|
typename Container::iterator pos = binaryInsertPosition(result, leftover);
|
||||||
result.insert(pos, leftover);
|
result.insert(pos, leftover);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user