C 在快速排序中交换两个变量时会发生奇怪的事情
我正在用C实现快速排序 以下是我的交换过程:C 在快速排序中交换两个变量时会发生奇怪的事情,c,quicksort,swap,C,Quicksort,Swap,我正在用C实现快速排序 以下是我的交换过程: void swap(int *x, int *y) { *x += (*y); *y = (*x) - (*y); *x = (*x) - (*y); } int partition(int a[], int sx, int dx) { int indice_pivot = (rand()%(dx-sx+1))+sx; int i = sx-1, j; swap(&a[indice_pivo
void swap(int *x, int *y)
{
*x += (*y);
*y = (*x) - (*y);
*x = (*x) - (*y);
}
int partition(int a[], int sx, int dx)
{
int indice_pivot = (rand()%(dx-sx+1))+sx;
int i = sx-1, j;
swap(&a[indice_pivot],&a[dx]);
for(j=sx;j<dx;j++)
{
if(a[j] <= a[dx])
{
i++;
swap(&a[j],&a[i]);
}
}
i++;
swap(&a[i],&a[dx]);
return i;
}
下面是我的分区过程:
void swap(int *x, int *y)
{
*x += (*y);
*y = (*x) - (*y);
*x = (*x) - (*y);
}
int partition(int a[], int sx, int dx)
{
int indice_pivot = (rand()%(dx-sx+1))+sx;
int i = sx-1, j;
swap(&a[indice_pivot],&a[dx]);
for(j=sx;j<dx;j++)
{
if(a[j] <= a[dx])
{
i++;
swap(&a[j],&a[i]);
}
}
i++;
swap(&a[i],&a[dx]);
return i;
}
一切正常。为什么?交换(…)
- 有符号整数溢出未定义,如果
和*x
足够大,则可能会发生此溢出*y
- 绝对没有人能轻易判断实现
的代码是否正确swap()
- 如果
,swap()函数将无法正常工作。这是因为在i==j
swap()
*y=(*x)-(*y)
将元素设置为0,因为它相当于*x=(*x)-(*x)代码>
带有temp变量的第二个swap函数保留这些值
乍一看,它看起来像swap(&a[indice_pivot]、&a[dx])代码>可能命中同一个元素。您可以使用断言(indice_pivot!=dx)
来确定(当然也可以将其放入交换函数中)。@David Ok。那是不是第一次交换击中了同一个元素?是的。再次感谢。我认为这是一堂宝贵的人生课。为了在临时变量上保存4个字节,您太过努力了。这表明最好释放4个字节,并有可维护和工作的代码。