#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
class QPointF
{
public:
QPointF(double xpos, double ypos) : xp(xpos), yp(ypos) {}
inline bool operator==(const QPointF &p) {
return p.x() == xp && p.y() == yp;
}
double x() const { return xp; };
double y() const { return yp; };
private:
double xp;
double yp;
};
class LessYComparator
{
public:
inline bool operator() (const QPointF& p1, const QPointF& p2)
{
return (p1.y() < p2.y());
}
bool cmp(const QPointF &p1, const QPointF &p2) {
return p1.y() < p2.y();
}
};
class LessXComparator
{
public:
inline bool operator() (const QPointF& p1, const QPointF& p2)
{
return (p1.x() < p2.x());
}
bool cmp(const QPointF &p1, const QPointF &p2) {
return p1.x() < p2.x();
}
};
void partitionField(std::vector<QPointF>* field,
const int leftIndex,
const int rightIndex,
const std::function<int(QPointF)>& medianCompare)
{
auto leftIt = field->begin() + leftIndex;
// Ende ist bei std::partition() explizit, deshalb + 1
auto rightIt = field->begin() + rightIndex + 1;
std::stable_partition(leftIt, rightIt, medianCompare);
}
int main() {
std::vector<QPointF> xPoints = {
QPointF(-0.9123711701495426, 0.31958762886597936),
QPointF(0.5000000197994668, 0.19072164948453607),
QPointF(-0.5051546591788427, 0.7010309278350515),
QPointF(-0.18041237827815806, 0.6649484536082475),
QPointF(0.7938144644238956, 0.6907216494845361)
};
std::vector<QPointF> yPoints = xPoints;
std::sort(xPoints.begin(), xPoints.end(), LessXComparator());
std::sort(yPoints.begin(), yPoints.end(), LessYComparator());
int leftIndex = 0;
int rightIndex = yPoints.size() - 1;
int medianIndex = (leftIndex + rightIndex + 1) / 2;
QPointF yMedian = yPoints[medianIndex];
const auto compare = [yMedian](const QPointF& point) {
return point.y() < yMedian.y();
};
partitionField(&xPoints, leftIndex, rightIndex, compare);
std::cout << "Median gefunden? : " << (xPoints[medianIndex] == yPoints[medianIndex]) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFFQb2ludEYKewpwdWJsaWM6CiAgICBRUG9pbnRGKGRvdWJsZSB4cG9zLCBkb3VibGUgeXBvcykgOiB4cCh4cG9zKSwgeXAoeXBvcykge30KICAgIAogICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBRUG9pbnRGICZwKSB7CiAgICAJcmV0dXJuIHAueCgpID09IHhwICYmIHAueSgpID09IHlwOwogICAgfQoKICAgIGRvdWJsZSB4KCkgY29uc3QgeyByZXR1cm4geHA7IH07CiAgICBkb3VibGUgeSgpIGNvbnN0IHsgcmV0dXJuIHlwOyB9OwoKcHJpdmF0ZToKICAgIGRvdWJsZSB4cDsKICAgIGRvdWJsZSB5cDsKfTsKCmNsYXNzIExlc3NZQ29tcGFyYXRvcgp7CnB1YmxpYzoKCiAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBRUG9pbnRGJiBwMSwgY29uc3QgUVBvaW50RiYgcDIpCiAgICB7CiAgICAgICAgcmV0dXJuIChwMS55KCkgPCBwMi55KCkpOwogICAgfQoKICAgIGJvb2wgY21wKGNvbnN0IFFQb2ludEYgJnAxLCBjb25zdCBRUG9pbnRGICZwMikgewogICAgICAgIHJldHVybiBwMS55KCkgPCBwMi55KCk7CiAgICB9Cn07CgpjbGFzcyBMZXNzWENvbXBhcmF0b3IKewpwdWJsaWM6CgogICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgUVBvaW50RiYgcDEsIGNvbnN0IFFQb2ludEYmIHAyKQogICAgewogICAgICAgIHJldHVybiAocDEueCgpIDwgcDIueCgpKTsKICAgIH0KCiAgICBib29sIGNtcChjb25zdCBRUG9pbnRGICZwMSwgY29uc3QgUVBvaW50RiAmcDIpIHsKICAgICAgICByZXR1cm4gcDEueCgpIDwgcDIueCgpOwogICAgfQp9OwoKdm9pZCBwYXJ0aXRpb25GaWVsZChzdGQ6OnZlY3RvcjxRUG9pbnRGPiogZmllbGQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlZnRJbmRleCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmlnaHRJbmRleCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGludChRUG9pbnRGKT4mIG1lZGlhbkNvbXBhcmUpCiAgewogICAgYXV0byBsZWZ0SXQgPSBmaWVsZC0+YmVnaW4oKSArIGxlZnRJbmRleDsKCiAgICAvLyBFbmRlIGlzdCBiZWkgc3RkOjpwYXJ0aXRpb24oKSBleHBsaXppdCwgZGVzaGFsYiArIDEKICAgIGF1dG8gcmlnaHRJdCA9IGZpZWxkLT5iZWdpbigpICsgcmlnaHRJbmRleCArIDE7CgogICAgc3RkOjpzdGFibGVfcGFydGl0aW9uKGxlZnRJdCwgcmlnaHRJdCwgbWVkaWFuQ29tcGFyZSk7CiAgfQoKaW50IG1haW4oKSB7CgkgIHN0ZDo6dmVjdG9yPFFQb2ludEY+IHhQb2ludHMgPSB7CiAgICBRUG9pbnRGKC0wLjkxMjM3MTE3MDE0OTU0MjYsIDAuMzE5NTg3NjI4ODY1OTc5MzYpLAogICAgUVBvaW50RigwLjUwMDAwMDAxOTc5OTQ2NjgsIDAuMTkwNzIxNjQ5NDg0NTM2MDcpLAogICAgUVBvaW50RigtMC41MDUxNTQ2NTkxNzg4NDI3LCAwLjcwMTAzMDkyNzgzNTA1MTUpLAogICAgUVBvaW50RigtMC4xODA0MTIzNzgyNzgxNTgwNiwgMC42NjQ5NDg0NTM2MDgyNDc1KSwKICAgIFFQb2ludEYoMC43OTM4MTQ0NjQ0MjM4OTU2LCAwLjY5MDcyMTY0OTQ4NDUzNjEpCiAgfTsKCiAgc3RkOjp2ZWN0b3I8UVBvaW50Rj4geVBvaW50cyA9IHhQb2ludHM7CgogIHN0ZDo6c29ydCh4UG9pbnRzLmJlZ2luKCksIHhQb2ludHMuZW5kKCksIExlc3NYQ29tcGFyYXRvcigpKTsKICBzdGQ6OnNvcnQoeVBvaW50cy5iZWdpbigpLCB5UG9pbnRzLmVuZCgpLCBMZXNzWUNvbXBhcmF0b3IoKSk7CgogIGludCBsZWZ0SW5kZXggPSAwOwogIGludCByaWdodEluZGV4ID0geVBvaW50cy5zaXplKCkgLSAxOwogIGludCBtZWRpYW5JbmRleCA9IChsZWZ0SW5kZXggKyByaWdodEluZGV4ICsgMSkgLyAyOwoKICBRUG9pbnRGIHlNZWRpYW4gPSB5UG9pbnRzW21lZGlhbkluZGV4XTsKCiAgY29uc3QgYXV0byBjb21wYXJlID0gW3lNZWRpYW5dKGNvbnN0IFFQb2ludEYmIHBvaW50KSB7CiAgICByZXR1cm4gcG9pbnQueSgpIDwgeU1lZGlhbi55KCk7CiAgfTsKCiAgcGFydGl0aW9uRmllbGQoJnhQb2ludHMsIGxlZnRJbmRleCwgcmlnaHRJbmRleCwgY29tcGFyZSk7CiAgCiAgc3RkOjpjb3V0IDw8ICJNZWRpYW4gZ2VmdW5kZW4/IDogIiA8PCAoeFBvaW50c1ttZWRpYW5JbmRleF0gPT0geVBvaW50c1ttZWRpYW5JbmRleF0pIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==