Recursion 递归快速排序的奇怪输出

Recursion 递归快速排序的奇怪输出,recursion,bit-manipulation,quicksort,xor,Recursion,Bit Manipulation,Quicksort,Xor,我试图在C中实现一个递归快速排序,它通过使用位异或操作来完成所有交换。以下是我到目前为止得到的信息: //bitwise recursive quicksort void quicksort(int *int_array,int p, int r){ if(p<r){ int q = part(int_array, p, r); quicksort(int_array,p, q-1); quicksort(i

我试图在C中实现一个递归快速排序,它通过使用位异或操作来完成所有交换。以下是我到目前为止得到的信息:

//bitwise recursive quicksort 
void quicksort(int *int_array,int p, int r){
    if(p<r){
            int q = part(int_array, p, r);
            quicksort(int_array,p, q-1);
            quicksort(int_array, q+1, r);
    }
}
//Partition 
int part(int *int_array, int p, int r){
    int pivot = int_array[r];
    int i = p-1;
    int j;
    for(j = p; j<=r-1; j++){
            if(int_array[j] <= pivot){
                    i++;
                    int_array[i] = int_array[i] ^ int_array[j];
                    int_array[j] = int_array[i] ^ int_array[j];
                    int_array[i] = int_array[i] ^ int_array[j];

            }
    }
    int_array[i+1] = int_array[i+1] ^ int_array[r];
    int_array[r] = int_array[i+1] ^ int_array[r];
    int_array[i+1] = int_array[i+1] ^ int_array[r];
    return i+1;
}
//按位递归快速排序
无效快速排序(int*int\u数组、int p、int r){

如果(pXOR交换算法在与自身交换项时不起作用,因为与自身进行XOR交换的任何数字都将为0,则该算法依赖于有两个位置。因此,在第一行之后,您刚刚擦除了值

:

但是,如果x和y使用相同的存储位置,该算法将失败,因为存储在该位置的值将由第一条XOR指令清零,然后保持为零;它不会“与自身交换”。请注意,这与x和y具有相同的值不同。只有当x和y使用相同的存储位置时才会出现问题,在这种情况下,它们的值必须已经相等

您可以在交换周围进行测试,以确保从不尝试将元素与自身交换:

int part(int *int_array, int p, int r){
    int pivot = int_array[r];
    int i = p-1;
    int j;
    for(j = p; j<=r-1; j++){
            if(int_array[j] <= pivot){
                    i++;
                    if(i != j) // avoid XORing item with itself
                    {
                        int_array[i] = int_array[i] ^ int_array[j];
                        int_array[j] = int_array[i] ^ int_array[j];
                        int_array[i] = int_array[i] ^ int_array[j];
                    }
            }
    }
    if(i+1 != r) // avoid XORing item with itself
    {
        int_array[i+1] = int_array[i+1] ^ int_array[r];
        int_array[r] = int_array[i+1] ^ int_array[r];
        int_array[i+1] = int_array[i+1] ^ int_array[r];
    }
    return i+1;
}
int部分(int*int\u数组,int p,int r){
int pivot=int_数组[r];
int i=p-1;
int j;
对于(j=p;j