3

我有一个由两个元素char *wordint number. 当我想使用冒泡排序对它们进行排序时,我必须为它们编写交换部分:

int i,j,tmp;
    char * temp;
    for(i=0; i<max;i++)
    {
        for(j=0;j<max-i;j++)
        {
            if(strcmp(array[j].word,array[j+1].word)>0)
            {
                temp=array[j].word;
                array[j].word=array[j+1].word;
                array[j+1].word=temp;
                tmp=array[j].number;
                array[j].number=array[j+1].number;
                array[j+1].number=tmp;

            }
        }
    }

编辑我的结构声明

typedef struct{
    char *word;
    int number;
}
words;
words *array=NULL;

如果数组中有 n 个元素怎么办?交换所有东西将非常耗时。有没有办法省略这个?

当然,除了我不想使用的其他排序算法(如qsort)。

4

3 回答 3

4

如果您关心交换过程中的性能,您应该考虑您正在使用的结构类型的指针数组:

struct your_stuct *arr[MAX];

如果你正确设置了这个数组,交换将只改变内存地址而不是结构内容,它可以运行得更快:

在您的内部循环中,您应该使用:

struct your_struct *temp;
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;

这是你在你的问题的意思吗?

于 2012-09-19T18:56:39.070 回答
2

与其对自身进行排序,不如structs创建一个指向结构的指针数组,以及一个适当的比较函数,该函数通过指针从结构中读取适当的值,并对指针列表进行排序。当然,所有额外的间接方式都可能掩盖了您从不实际交换结构中获得的任何性能提升,因为您的结构相当小,但对于大型结构,这种方法很有意义。

于 2012-09-19T18:57:34.000 回答
0
int i, j, tmp;
words temp;

for (i = 0; i < max; i++)
{
    for (j = 0; j < max - i; j++)
    {
        if (strcmp(array[j].word, array[j + 1].word) > 0)
        {
            memcpy(&temp, array[j], sizeof(words));
            memcpy(array[j], array[j + 1], sizeof(words));
            memcpy(array[j + 1], &temp, sizeof(words));
        }
    }
}
于 2012-09-19T19:02:48.857 回答