#include <stdio.h>
#include <stdlib.h>
// point type
typedef struct {
int x;
int y;
} Point;
// point compare function
int compare_points(const void *p1, const void *p2)
{
const Point *pt1 = p1;
const Point *pt2 = p2;
// do primary compare on x
if (pt1->x > pt2->x)
return 1;
if (pt1->x < pt2->x)
return -1;
// pt1->x == pt2->x - do secondary compare on y...
if (pt1->y > pt2->y)
return 1;
if (pt1->y < pt2->y)
return -1;
// pt1 == pt2
return 0;
}
int main()
{
#define num_points 4
Point points[num_points] = { { 2, 3 }, { 4, 2 }, { 4, -1 }, { -1, 3 } };
int i;
for (i = 0; i < num_points; ++i)
printf("{ %d, %d }\n", points
[i
].
x, points
[i
].
y);
// sort array of points...
qsort(points
, num_points
, sizeof(Point
), compare_points
);
for (i = 0; i < num_points; ++i)
printf("{ %d, %d }\n", points
[i
].
x, points
[i
].
y);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vIHBvaW50IHR5cGUKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCB4OwogICAgaW50IHk7Cn0gUG9pbnQ7CgovLyBwb2ludCBjb21wYXJlIGZ1bmN0aW9uCgppbnQgY29tcGFyZV9wb2ludHMoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQp7CiAgICBjb25zdCBQb2ludCAqcHQxID0gcDE7CiAgICBjb25zdCBQb2ludCAqcHQyID0gcDI7CgogICAgLy8gZG8gcHJpbWFyeSBjb21wYXJlIG9uIHgKICAgIGlmIChwdDEtPnggPiBwdDItPngpCiAgICAgICAgcmV0dXJuIDE7CiAgICBpZiAocHQxLT54IDwgcHQyLT54KQogICAgICAgIHJldHVybiAtMTsKCiAgICAvLyBwdDEtPnggPT0gcHQyLT54IC0gZG8gc2Vjb25kYXJ5IGNvbXBhcmUgb24geS4uLgogICAgaWYgKHB0MS0+eSA+IHB0Mi0+eSkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChwdDEtPnkgPCBwdDItPnkpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgIC8vIHB0MSA9PSBwdDIKICAgIHJldHVybiAwOyAgICAgICAgCn0KCmludCBtYWluKCkKewoJI2RlZmluZSBudW1fcG9pbnRzIDQKCVBvaW50IHBvaW50c1tudW1fcG9pbnRzXSA9IHsgeyAyLCAzIH0sIHsgNCwgMiB9LCB7IDQsIC0xIH0sIHsgLTEsIDMgfSB9OwoJaW50IGk7CgkKCXByaW50ZigiQkVGT1JFOlxuIik7Cglmb3IgKGkgPSAwOyBpIDwgbnVtX3BvaW50czsgKytpKQoJICAgIHByaW50ZigieyAlZCwgJWQgfVxuIiwgcG9pbnRzW2ldLngsIHBvaW50c1tpXS55KTsKCSAgICAKCS8vIHNvcnQgYXJyYXkgb2YgcG9pbnRzLi4uCglxc29ydChwb2ludHMsIG51bV9wb2ludHMsIHNpemVvZihQb2ludCksIGNvbXBhcmVfcG9pbnRzKTsKCQoJcHJpbnRmKCJBRlRFUjpcbiIpOwoJZm9yIChpID0gMDsgaSA8IG51bV9wb2ludHM7ICsraSkKCSAgICBwcmludGYoInsgJWQsICVkIH1cbiIsIHBvaW50c1tpXS54LCBwb2ludHNbaV0ueSk7CgogICAgcmV0dXJuIDA7Cn0KCg==
BEFORE:
{ 2, 3 }
{ 4, 2 }
{ 4, -1 }
{ -1, 3 }
AFTER:
{ -1, 3 }
{ 2, 3 }
{ 4, -1 }
{ 4, 2 }