c++ qsort对结构体排序。

struct Point
{
int x;
int y;
};
int comp(const void *a, const void *b)
{
return -1; //return 1没问题。//我觉得是在交换的时候出问题了。
}
int main()
{
Point *point = new Point[n];
for(int i=0; i<n; i++)
{
cin>>point[i].x>>point[i].y;
}
qsort(point, sizeof(Point), n, comp);
for(int i=0; i<n; i++)
{
cout<<point[i].x<<" "<<point[i].y<<endl;
}
}

第1个回答  推荐于2018-04-16
#include <iostream>
#include <cstdlib>
using namespace std;
static const int n = 3;

struct Point
{
    int x;
    int y;
};
int comp(const void *a, const void *b)
{
    const Point *p1 = (const Point *)a;
    const Point *p2 = (const Point *)b;
    if (p1->x > p2->x) return 1;
    if (p1->x < p2->x) return 0;
    if (p1->x == p2->x) {
        if (p1->y > p2->y) return 1;
        if (p1->y < p2->y) return 0;
    }
    return true;
}
int main()
{
    Point *point = new Point[n];
    for(int i=0; i<n; i++)
    {
        cin>>point[i].x>>point[i].y;
    }
    qsort(point, n, sizeof(Point), comp);
    for(int i=0; i<n; i++)
    {
        cout<<point[i].x<<" "<<point[i].y<<endl;
    }
    delete[] point;
    return 0;
}

第2个回答  推荐于2016-11-16
#include <iostream>
#include <cstdlib>
using namespace std;
static const int n = 3;

struct Point
{
int x;
int y;
};
int comp(const void *a, const void *b)
{
const Point *p1 = (const Point *)a;
const Point *p2 = (const Point *)b;
if (p1->x > p2->x) return 1;
if (p1->x < p2->x) return 0;
if (p1->x == p2->x) {
if (p1->y > p2->y) return 1;
if (p1->y < p2->y) return 0;
}
return true;
}
int main()
{
Point *point = new Point[n];
for(int i=0; i<n; i++)
{
cin>>point[i].x>>point[i].y;
}
qsort(point, n, sizeof(Point), comp);
for(int i=0; i<n; i++)
{
cout<<point[i].x<<" "<<point[i].y<<endl;
}
delete[] point;
return 0;
}追问

始终返回-1,让第一个始终小于第二个啊。为什么输出不正确。qsort(),底层是用什么排序算法。更改的是数组元素的地址,始终返回-1应该至少会有结果啊。

追答

始终返回-1, 会有结果, 结果仍然是没有排序的. 因为第一个和第二个数的大小是不确定的.
comp是决定排序的策略.
qsort底层是"快速排序算法", 每次选定一个中间值, 把大于该值的数放在左边,小于该值的数放在右边,这样经过有限次遍数后,达到有序。
这里的大于指的 是comp判定为1的。

追问

返回的结果是内存地址,那些数据都没了。我的是vs2010。

本回答被提问者采纳
第3个回答  2013-05-17
VC6 帮助里的对qsort 里compare函数指针参数的要求:
compare((void*)elem1,(void*)elem2);
The routine must compare the elements, then return one of the following
values:
Return Value Description
< 0 elem1 less than elem2
0 elem1 equivalent to elem2
> 0 elem1 greater than elem2

1)
int less_x(const void *a, const void *b)
{
cons Point * pa=a,*pb=b;
return pb->x-pa->x;
}
qsort(point, sizeof(Point), n, less_x);

2)
int less_y( cons Point *a, cons Point *b)

{
return b->y-a->y;
}
qsort(point, sizeof(Point), n, (int (*)(const void *, const void *))less_x);

3)
int less_xy( cons Point *a, cons Point *b)

{
if(a->x<b->x && a->y<b->y )return -1;
if(a->x==b->x && a->y ==b->y )return 0;
return 1;
}
qsort(point, sizeof(Point), n, (int (*)(const void *, const void *))less_xy);本回答被网友采纳
第4个回答  2013-05-17
你如果要按照x的大小顺序牌还是Y 的大小顺序牌,。
int comp(const void *a, const void *b)
{
return -1; //这里问题大的
如果按照x 的从小到达的顺序
应该这么写 ((*point)a)->x-((*Point)b->x)
x从大到小 ((*point))->x-((*Point)->x)
同理对于Y
}
相似回答