如何按字母顺序对字符串数组(2D数组)进行排序?

时间:2013-07-19 23:11:50

标签: c arrays function sorting alphabetical

我已经有一个从文本文件读入的字符串列表到一个名为word的二维数组中,准备好进行排序。

列表如下:

I
like
cherry
pie
and
chocolate
pie

我希望列表在排序后显示如下:

and
cherry
chocolate
I
like
pie
pie

功能原型如下。 int counter是字符串的数量,MAX_CHAR_LEN = 1024以防您想知道。

void alphabetize(char word[][MAX_CHAR_LEN], int counter)
{

    return;
}

请注意,仅按第一个字符排序是不够的,因为列表包含两个以“ch”开头的字符串

有人可以提供可以执行此操作的功能吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

您想使用qsort()功能。

qsort(base, num_of_elements, element_size, my_compare);

比较函数my_compare接受两个参数,每个参数为const void *,并返回一个数字,表示参数的相对顺序。负数表示第一个参数在第二个参数之前。正数表示第一个参数在第二个参数之后。如果参数比较相等,则返回零。

由于您的字符串比较不区分大小写,您需要创建自己的比较函数,或者找到系统提供的不属于C库的函数。 POSIX为此目的提供strcasecmp()(Google告诉我,_stricmp()在Windows上可用。)

int my_compare (const void *a, const void *b) {
    return strcasecmp(a, b);
}

定义比较函数通常是使用qsort()最棘手的部分。您必须了解传递给该函数的指针的上下文。当TYPE的数组传递到qsort()时,它会将指向const TYPE的指针传递给比较函数的每个参数。

在您的情况下,您将传入一组MAX_CHAR_LEN char的数组。因此,比较函数的每个参数都是指向MAX_CHAR_LEN char s的const数组的指针。这意味着从技术上讲,my_compare函数应该这样写:

int my_compare (const void *a, const void *b) {
    typedef char TYPE[MAX_CHAR_LEN];
    const TYPE *aa = (const TYPE *)a;
    const TYPE *bb = (const TYPE *)b;
    return strcasecmp(*aa, *bb);
}

通常不需要对参数进行强制转换,除了C实际上不支持常量数组的概念。它将这样的东西转换为常量数组,因此需要强制转换才能反映出来。

但是,数组的地址等于其第一个元素的地址。也就是说,对于上面的代码,以下断言都是正确的:

    assert(aa == (const void *)*aa);
    assert(bb == (const void *)*bb);

因此,因为指向数组的指针取消引用等于同一数组的衰减地址值,my_compare()的第一个实现就足以用于2-D数组。

答案 1 :(得分:1)

您可以使用qsort功能进行排序。您还需要创建一个比较两个字符数组的比较函数,然后将该函数指针作为参数传递。

对ints进行排序的示例:

/* qsort example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */

int values[] = { 40, 10, 100, 90, 20, 25 };

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

int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare); 
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}

上面的代码很容易适用于对字符数组进行排序而不是整数。

答案 2 :(得分:0)

如果你想编写自己的排序函数,这样的事情非常简单。

for (int i = 0; i < array.size(); i++)
{
    for (int j = i+1; j < array.size(); j++)
    {
        if (array[i] > array[j])
            swap(array[i],array[j]);
    }
}

答案 3 :(得分:0)

qsort是不错的选择。查看详细信息here

您也可以尝试Bubble Sort。它在C中的实现很简单 - 请参阅Good answer获取帮助