【问题标题】:Bubble sort for void* array C [duplicate]void *数组C的冒泡排序[重复]
【发布时间】: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(或两者兼有)变量名称如v1 a b dim 等是没有意义的,甚至在当前情况下
  • 您的代码实际包含哪些头文件>?你希望我们猜对吗?
  • 请注意,如果将足够大的正数与足够大的负数进行比较,compareInt() 函数会由于(有符号)整数溢出而陷入未定义的行为,这通常会发生。使用return ((*a) &gt; (*b)) - ((*a) &lt; (*b)); 或同等产品可能会做得更好。这避免了以两次比较而不是一次减法为代价的溢出(以及因此错误的答案)。 YMMV。

标签: c bubble-sort


【解决方案1】:

您的问题在于您的交换函数(除了一些拼写错误),因为您只交换作为参数传递的指针,因此保持数组不变。

void swap(void *a, void *b){
    int aux;
    aux=*((int*)a);
    *((int*)a)=*((int*)b);
    *((int*)b)=aux;
}

应该为int 解决问题。如果你想要一个通用的swap 函数,应该传递一个大小参数。

还要注意void * 的指针算法只是一个编译器扩展,不在标准中。 v1+j*bytes 应该是 (char*)v1+j*bytes。

【讨论】:

  • swap 可能应该传递一个 [byte] size 参数,因为 OP 希望排序是通用的(即 int 如图所示,但(例如)double 将来)
  • @CraigEstey 是的,你是对的,要么它应该声明为 swapInt,与比较函数相同,要么是传递大小参数的更好方法。
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2020-05-17
  • 2016-02-10
  • 1970-01-01
  • 2013-09-28
  • 2017-05-29
相关资源
最近更新 更多