c - 在 QuickSort 中交换两个变量时会发生奇怪的事情

标签 c quicksort swap

我正在用 C 实现 QuickSort。

这是我的交换程序:

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;
}

一切正常。为什么?

最佳答案

如果两个指针都指向同一个元素,您的交换函数将不起作用。如果他们执行第二步 *y = (*x) - (*y); 将元素设置为 0,因为它等同于 *x = (*x) - (* x);

带有临时变量的第二个交换函数保留值。

乍一看,swap(&a[indice_pivot],&a[dx]); 可能命中了同一个元素。您可以使用 assert( indice_pivot != dx ) 来确定(当然也可以将其放入交换函数中)。

关于c - 在 QuickSort 中交换两个变量时会发生奇怪的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29801254/

相关文章:

c - 在 arm-linux 中使用 ptrace 获取寄存器

c - 当剩余内存超过一定大小时,我的自定义 malloc 函数崩溃

concurrency - 在并行快速排序实现中使用 go 例程时性能更差

c - 为什么值没有交换

c++ - 树莓派uart波特率锁定在9600

c++ - 当算法需要零秒/毫秒时间时,如何获得近似时间?

c - 快速排序指向结构的指针数组

c++ - 专门化函数模板的语法

Azure Web 应用程序交换和用户上传的文件

c - 将十六进制转换为二进制字符串时,如何摆脱 C 中的堆损坏错误(严重错误 c0000374)?