用于排序对象数组的qsort

时间:2012-12-18 14:50:13

标签: c++ quicksort

我正在尝试使用qsort()对对象指针数组进行排序(PointP = Point *) 附件是比较函数和排序,问题是没有任何反应并且不会发生排序。

int compareByAngleP(const void* elem1,const void* elem2) {
    PointP point1 = (PointP) elem1;
    PointP point2 = (PointP) elem2;
    if (abs(point1->getAngle() - point2->getAngle())>0.001)
    {
        return point1->getAngle() - point2->getAngle();
    }
    return  point1->getY() - point2->getY();
}

void sortArrayP(PointP* array, int size) {
    qsort(array,size, sizeof(PointP), compareByAngleP);
}

4 个答案:

答案 0 :(得分:4)

我的建议将忘记std::qsort,赞成普通的std::sort。与std::qsort不同,它是类型安全的,在大多数实现中要快得多。

std::sort(array, array+size, compareByAngleP);

并且在比较函数中删除void*以支持实际类型。

此外,如果您使用的是C ++ 11,并且该数组只是本地的:

std::sort(std::begin(array), std::end(array), compareByAngleP);

或者更好的方法是使用std::vector或其他最受欢迎的容器。

std::vector<Point> array { ... };
std::sort(array.begin(), array.end(), compareByAngleP);

注意

您可能需要修改比较函数,以便在第一个参数小于第二个参数时返回true。 (或简单地为Point实现operator <

参考

http://en.cppreference.com/w/cpp/algorithm/sort

http://en.cppreference.com/w/cpp/container/vector

答案 1 :(得分:2)

使用qsort和比较功能时存在一些问题。

  1. qsort将使用memcpy(或类似)来重新排序数组的元素。如果您的Point类型具有复制构造函数(或具有复制构造函数的成员),则在其上使用qsort会导致问题(导致未定义的行为)。

  2. 您的compareByAngleP函数不适合排序,因为它检查的关系不可传递。 例如,如果您有三个点ABC,则所有点都具有相同的Y坐标,并且分别具有角度10.000,{{1然后10.001表示10.002compareByAngeP,但是A == B,这可能会对排序功能造成严重破坏。

答案 2 :(得分:0)

关于qsort引用(http://en.cppreference.com/w/cpp/algorithm/qsort)qsort的第三个参数应该是'数组中每个元素的大小,以字节为单位',而不是

qsort(array,size, sizeof(PointP), compareByAngleP);

qsort(array,size, sizeof(PointP*), compareByAngleP);

另外,你很难将float转换为int(同时从比较函数返回值)。但是:

(int)0.2 == 0

答案 3 :(得分:0)

我认为如果从Compare函数返回bool而不是int,那么就会发生不同的事情。