我正在C中实现QuickSort.
这是我的交换程序:
void swap(int *x, int *y)
{
*x += (*y);
*y = (*x) - (*y);
*x = (*x) - (*y);
}
Run Code Online (Sandbox Code Playgroud)
这是我的分区程序:
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;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当交换两个变量时,它们神奇地(?)变为0.我做了一些调试,一切似乎在交换过程中工作正常.但是数组在某些分区的末尾包含零(并非所有分区).奇怪的是,如果我用替换交换过程
void swap(int *x, int *y)
{
int temp = *y;
*y = *x;
*x = temp;
}
Run Code Online (Sandbox Code Playgroud)
一切正常.为什么?
如果两个指针指向同一元素,则交换功能将不起作用.如果他们这样做,第二步*y = (*x) - (*y);将元素设置为0,因为它相当于*x = (*x) - (*x);
带有temp变量的第二个交换函数会保留这些值.
一眼就看起来swap(&a[indice_pivot],&a[dx]);可能会碰到相同的元素.您可以assert( indice_pivot != dx )用来确定(或者当然在交换函数中放置一个).