使用C中的qsort按频率将单词排序到哈希表中

时间:2014-10-18 06:04:31

标签: c quicksort qsort

我的任务是改进程序的运行时,该程序将.txt文件中的所有单词排序到哈希表中。这种三嵌套for循环排序算法是问题所在:

// Sort hash table elements and save as pointers in 'array'
for (i = 0; i < tsize; i++)
   for (ele = htable[i]; ele != NULL; ele = ele->next) {
    if (ele->freq == 1)
    scnt++;

    for (j = cnt; j > 0 && ele->freq > array[j-1]->freq; j--)
      array[j] = array[j-1];

    array[j] = ele;
    cnt++;
}

我想要做的是使用qsort(),但我迷失了应该从哪里开始。任何建议都会有所帮助,谢谢。

更新: 我已将上述代码段修改如下:

// Sort hash table elements and save as pointers in 'array'
for (i = 0; i < tsize; i++)
   for (ele = htable[i]; ele != NULL; ele = ele->next) {
    if (ele->freq == 1)
    scnt++;

    array[cnt] = ele;
    qsort(array, tsize, sizeof(h_ptr), (int (*) (const void *, const void *))compare_ele);
    cnt++;
}

并添加了这个比较功能:

// Compare function for qsort
int compare_ele (h_ptr *a, h_ptr *b)
{
    if (a->freq < b->freq)
        return + 1;
    if (a->freq > b->freq)
        return - 1;
    return 0;
}

h_ptr的结构是:

typedef struct HELE {
    char *word;
    int freq;
    struct HELE *next;
} h_rec, *h_ptr;

编译时,我收到此错误:

analysis.c: In function ‘compare_ele’:
analysis.c:137:10: error: request for member ‘freq’ in something not a structure or union
 if (a->freq < b->freq)
      ^
analysis.c:137:20: error: request for member ‘freq’ in something not a structure or union
 if (a->freq < b->freq)
                ^
analysis.c:139:10: error: request for member ‘freq’ in something not a structure or union
 if (a->freq > b->freq)
      ^
analysis.c:139:20: error: request for member ‘freq’ in something not a structure or union
 if (a->freq > b->freq)

1 个答案:

答案 0 :(得分:1)

更新后的代码中的两个for循环正在创建一个未排序的数组,同时跟踪变量cnt中数组中的项目数。在完成qsort次循环后,您应该致电for,并将cnt作为第二个参数传递给qsort

比较函数应始终遵循qsort指定的函数原型。定义一个比较器函数是不好的做法,该函数在用作qsort的第四个参数时需要强制转换。有关如何编写正确的比较器功能的示例,请参见wikipedia article

在您的情况下,比较器功能的前两行应为

h_rec *a = *(const h_rec **)p;
h_rec *b = *(const h_rec **)q;

请注意,我总是避免将*放在typedef中。这是您的错误消息的来源,您没有正确地说明在您的代码中,ab实际上是指向指向结构的指针类型HELE