【发布时间】:2010-10-09 17:44:51
【问题描述】:
我假设 stdlib 中良好的旧 qsort 函数不稳定,因为手册页没有说明它。这就是我说的函数:
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
我假设如果我将比较函数更改为还包括我正在比较的地址,它将是稳定的。那是对的吗?
例如:
int compareFoos( const void* pA, const void *pB ) {
Foo *pFooA = (Foo*) pA;
Foo *pFooB = (Foo*) pB;
if( pFooA->id < pFooB->id ) {
return -1;
} else if( pFooA->id > pFooB->id ) {
return 1;
} else if( pA < pB ) {
return -1;
} else if( pB > pA ) {
return 1;
} else {
return 0;
}
}
【问题讨论】:
-
我不明白你为什么要比较指针。你所说的稳定是什么意思(请原谅我的无知)。也许您可以详细说明您的问题。
-
稳定的意思是项目 a 比较等于项目 b,并且 a 在数组中最初排在 b 之前,它会仍然在排序数组中排在 b 之前。排序圈中的艺术术语,以及比较地址的黑客的原因。非常整洁。
-
非常巧妙的想法,@dmckee,但不幸的是不稳定,因为 twk 使用的是当前地址而不是起始地址:-)
-
@paxdiablo:不仅不稳定;它还通过违反比较函数的约束来调用未定义的行为。特别是,它可能会导致
qsort的某些实现进入无限循环,甚至在排列数组时执行越界写入。 -
老实说,只需使用外部稳定的排序功能:)
标签: c qsort stable-sort