【问题标题】:Weird output on recursive QuickSort递归快速排序的奇怪输出
【发布时间】:2017-10-10 10:19:10
【问题描述】:

我正在尝试在 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。知道为什么吗?我看不出异或交换有什么问题。任何帮助表示赞赏,谢谢!

【问题讨论】:

    标签: recursion bit-manipulation quicksort xor


    【解决方案1】:

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

    XOR swap algorithm:

    但是,如果 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多