如果我在C中有一个坐标为x和y的结构POINT,那么通过该对的第一个元素对它进行排序的可接受方式是什么,然后如果第一个相等则是第二个?我在C ++中找到了很多答案,但在C..中却找不到答案吗?
答案 0 :(得分:5)
只需使用qsort和适当的比较功能,例如
// 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;
}
// sort an array of points...
qsort(points, num_points, sizeof(Point), compare_points);
答案 1 :(得分:1)
你可以写一个独特的比较器函数
int comparator(POINT* p1, POINT* p2) {
if (p1->x < p2->x) {
return -1;
}
if (p1->x > p2->x) {
return 1;
}
if (p1->y < p2->y) {
return -1;
}
if (p1->y > p2->y) {
return 1;
}
return 0;
}
并将其与任何正常的排序实现一起使用,
或者您可以定义坐标范围(例如0 int createCombinedCoordinate(POINT* p1) {
return P1->x * 100 + p1->y;
}
答案 2 :(得分:-1)
已经有几个答案,但它们的实现似乎太复杂了;)
struct pair
{
int x;
int y;
};
static inline int safe_cmp(int x, int y)
{
return (x > y) - (x < y);
}
int lex_cmp_pairs(const void *left, const void *right)
{
const struct pair *l = left;
const struct pair *r = right;
const int cmp_x = safe_cmp(l->x, r->x);
const int cmp_y = safe_cmp(l->y, r->y);
return (cmp_x == 0) ? cmp_y : cmp_x;
}
/* example usage: */
struct pair ps[] = { {3, 3}, {2, 5}, {1, 1}, {2, 2}, {1, 2}, {3, 1} };
qsort(ps, 6, sizeof(struct pair), lex_cmp_pairs);
请注意,如果您打算在线程环境中进行排序,则可能需要使用qsort_r
(GNU扩展名)。