我正在尝试在C中实现一个递归快速排序,它通过使用按位XOR操作完成所有交换。这是我到目前为止所得到的:
//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;
}
当我在20个整数的数组上运行此代码时,其中20个中的19个变为0.任何想法为什么?我不能看到XOR交换有什么问题。感谢任何帮助,谢谢!
答案 0 :(得分:1)
当交换项目时,XOR交换算法不起作用,因为任何与自身异或的数字都将为0,算法依赖于有两个位置。所以在第一行之后你刚刚擦掉了这个值。
但是,如果x和y使用相同的存储位置,算法将失败,因为存储在该位置的值将被第一个XOR指令清零,然后保持为零;它不会与自己交换&#34;。请注意,这与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;
}