解密qsort行为

时间:2011-09-12 02:50:41

标签: c qsort

我需要qsort的功能才能运行我的程序,到目前为止还没有完成它的工作。

我基本上是对单个字符值数组进行排序,以便将它们聚合成组,这样我就可以遍历数组并确定每个属性的计数。我的问题是qsort将“已排序”数组作为

返回
xxxxxbxbbbxfbxfbffffbxfxbbfbbbxxfxbxxfbbbbxbfxbxfbxbsxbbbxxbbxxffxbxfxfxbxxbxxfbbbfbxbbx
bbbsxfxbxbxxbfbfxbxxbxxbfxxbxsbfxxfxfxfffxbfxffbbfffsxsfbfbxbxbbbxxsbfbfbbbbbbxxfxfxffxf
xbxxbxfxbfbxbxxbxbxxbxbbffxxbxxffxxbxfxbxffxfsfxxfxxfxxfxfxxfxxbsxxbbbxsxxbbxxxbxfxsbxxx
ffbxfxxffbxxxfxxfxxfxfxxfffbxxxbxxxfffxsbbfffffxxxbbfxsbffxbxxfxbxxfbbfsbffsfffxfxfxbbffx
bxxfxbxxfxbbbfxxbbfxxbbbsxbxfbfbbxxbbfffxxfxxbbbfxxbxxxbbxxxbfxffxxxffxfxxffbxfsxbxxxfxfx
fsbbbxxxbfxfffsfxxxfssxxxfxfxxxxbxbbbxxbxxxxxxxxxxxxxxxxxxxfbfxxffxxbxxxxxxxsxsxxxxxxxxsxb
bxxxxxfxbxxxxfxxfxxxxxbbxfffbxbsxffbbbxsfbbfffbxbfbbxxbxxbbxxbffxfxxfxfbbxxbxfxxsfxxfxxbxf
xxbxxxbxbxbbxbbffxxxxbfbfxxxxxxfxffxxxxxxxxxxxxxxxxxxxxxbxffxbxbxbbxbbxxfbxfxbxxbxxbxbxxxb
xxbxbxbfbbffffffsbbxxbffbxfxxfxbfbfffsxbxxxsxxbbbbbxxxbxxxfxxfffxxxxxxxxxxxxxfxxbxxxxxxxxx
xxbfbxxxxxxxxxxxxxxxxxxxxxxxxxxbxbxxxxxfxxbxxxxffxbxxxxffxfbfffxbxxfxbfxbxxfxbxbfxxxxxfxbx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsbxxxxffxfxxxxxxxxxfxfxxxbffffxxxfbxbxfxxxxxxxxxxxxxxxxxxxxf
fxfxbfxxxfxxxxx

我认为问题与我的函数调用或比较方法有关。

int compare(const void *a, const void *b){
  return *(char * const *) a - *(char * const *) b;
}

并用于

qsort(temp, lineCount, sizeof(char), compare);

其中temp是上面的字符数组,lineCount是数组中的字符数。通过测试验证了阵列的完整性和尺寸。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

char * const *是指向char的指针。你只需要一个指向char的指针。

尝试:

int compare(const void *a, const void *b){
    return *(const char *) a - *(const char *) b;
}

此外,根据定义,sizeof(char)始终等于1。所以一些C程序员永远不会这样写出来。 (这是一个意见问题,它是否使代码更容易阅读,或只是表示你并不真正了解语言。在这种情况下,我碰巧喜欢它,但仅仅是FYI。)

答案 1 :(得分:1)

至少在开始时,我只是更明确地逐行编写比较,以便于调试:

int compare(const void *a, const void *b)
{
    char* alpha = (char*)a;   // Might get const-warning on these lines, ignore for now.
    char* beta  = (char*)b;

    if (*alpha == *beta) return 0;
    if (*alpha < *beta) return -1;
    return 1;
}

这样,您可以更轻松地在调试器中观看它,添加输出行,并且通常可以解决问题。

再次运行后,您可以将其重新组合成一个紧凑的代码行。

答案 2 :(得分:1)

试试这个:

int compare(const void *a, const void *b){
  return *(const char *) a - *(const char *) b;
}

但恕我直言,你根本不需要qsort

只需创建一个int [256](或更少)的表,并迭代数组以记录每个字符的计数:

int res[256];
memset(res, 0, 256*sizeof(int));
int i;
for (i=0;i<lineCount;i++){
    res[tmp[i]]++;
}

这将提供O(N)vs qsort的O(NlogN)。