通过第一个元素然后通过C中的第二个元素对对矢量进行排序

时间:2016-11-28 10:23:39

标签: c sorting point

如果我在C中有一个坐标为x和y的结构POINT,那么通过该对的第一个元素对它进行排序的可接受方式是什么,然后如果第一个相等则是第二个?我在C ++中找到了很多答案,但在C..中却找不到答案吗?

3 个答案:

答案 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);

LIVE DEMO

答案 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扩展名)。