【发布时间】:2015-04-22 14:48:14
【问题描述】:
我正在用 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_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;
}
问题是,当交换两个变量时,它们神奇地(?)变成了 0。我做了一些调试,在交换过程中一切似乎都正常。但是该数组在某些分区(不是全部)的末尾包含零。 奇怪的是,如果我用
替换交换过程void swap(int *x, int *y)
{
int temp = *y;
*y = *x;
*x = temp;
}
一切正常。为什么?
【问题讨论】:
-
我认为这是宝贵的人生教训。为了在临时变量上节省 4 个字节,您太努力了。这表明最好松散 4 个字节并拥有可维护和工作代码。