我的结构由两个元素char *word
和int 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个元素怎么办?交换一切都是非常耗时的。有没有办法省略这个?
OF COURSE除了我不想使用的其他排序算法(如qsort
)。
答案 0 :(得分:4)
如果您关心的是交换过程中的性能,您应该考虑使用的结构类型的指针数组:
struct your_stuct *arr[MAX];
如果你正确设置了这个数组,交换将只改变内存地址而不是结构内容,它可以更快地运行:
在你的内循环中你应该使用:
struct your_struct *temp;
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
这就是你在问题中的意思吗?
答案 1 :(得分:2)
不是自己对structs
进行排序,而是创建一个指向结构的指针数组,以及一个适当的比较函数,它通过指针从结构中读取适当的值,并对指针列表进行排序。当然,所有额外的间接可能会掩盖你实际上没有实际交换结构所带来的任何性能提升,因为你的结构相当小,但对于大型结构,这种方法很有意义。
答案 2 :(得分:1)
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));
}
}
}