【发布时间】:2018-11-04 20:08:56
【问题描述】:
我的代码不起作用。这个想法是制作一个可以冒泡交换通用数组的函数,但我不知道为什么它不起作用,如果我能得到一些帮助,将不胜感激。
int compareInt(int *a, int *b){
return (*a)-(*b);
}
void swap(void *a, void *b){
void *aux;
aux=a;
a=b;
b=aux;
}
void bubbleSort(void *v1, size_t dim, size_t bytes, int (*cmp)(void *, void *)){
int i, j;
for(i=0; i<dim1; i++)
for(j=0;j<dim1-1-i; j++){
if(cmp(v1+j*bytes, v1+(j+1)*bytes)>0)
swap(v1+j*bytes, v1+(j+1)*bytes);
}
}
void printVec(int *v1, int dim){
int i;
for(i=0; i<dim; i++)
printf("%d ",v1[i]);
printf("\n");
}
int main (void){
int v1[]={7,3,5,1,9,2};
printVec(v1, 6);
bubbleSort(v1, 6, sizeof(int), compareInt);
printVec(v1,6);
return 0;
}
【问题讨论】:
-
dim1在bubbleSort中的哪个位置?你的意思是dim? (即)按原样,这不会编译 -
另请参阅SO 5055-9106 和SO 4987-1989,了解有关通用交换实现的另外两个问题。请注意,您需要将大小传递给交换函数才能成功进行交换。
-
变量(和参数)名称应指示
content或usage(或两者兼有)变量名称如v1abdim等是没有意义的,甚至在当前情况下 -
您的代码实际包含哪些头文件>?你希望我们猜对吗?
-
请注意,如果将足够大的正数与足够大的负数进行比较,
compareInt()函数会由于(有符号)整数溢出而陷入未定义的行为,这通常会发生。使用return ((*a) > (*b)) - ((*a) < (*b));或同等产品可能会做得更好。这避免了以两次比较而不是一次减法为代价的溢出(以及因此错误的答案)。 YMMV。
标签: c bubble-sort