[英]sorting array of structures using bubble sort - how to speed up exchange of struct members
我有一个由两个元素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
)。
如果您关心的是交换过程中的性能,您应该考虑使用的结构类型的指针数组:
struct your_stuct *arr[MAX];
如果正确设置此数组,则交换将仅更改内存地址而不是结构内容,并且可以更快地运行:
在你的内循环中你应该使用:
struct your_struct *temp;
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
这就是你在问题中的意思吗?
不是对structs
本身进行排序,而是创建一个指向结构的指针数组,以及一个适当的比较函数,它通过指针从结构中读取适当的值,并对指针列表进行排序。 当然,所有额外的间接可能会掩盖你从没有实际交换结构所获得的任何性能增益,因为你的结构相当小,但对于大型结构,这种方法很有意义。
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));
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.