为什么使用Xor运算符在选择排序中交换对象不起作用?

时间:2019-09-12 16:27:18

标签: c++ selection-sort

我有一个实现选择排序算法的简单示例:

tkinter button,entry

问题是,当使用临时对象交换值时,效果很好,但是使用Xor运算符,则会得到错误的结果!

以下是使用Xor运算符的输出:

int main(){

    vector<int> vi{ 5, 7, 23, 7, 23, 5, 
    77, 10, 57, 23,  2  };
    int min = 0;
    for(int i = 0; i < vi.size() - 1; ++i){
        min = i;
        for(int j = i + 1; j < vi.size(); ++j){
            if(vi[j] < vi[min]){
                min = j;
            }
        }
            vi[i] ^= vi[min];
            vi[min] ^= vi[i];
            vi[i] ^= vi[min];
     //int tmp = vi[i];
            //vi[i] = vi[min];
            //vi[min] = tmp;
    }

    for(auto i : vi)
        cout << i << ", ";
    cout << endl;

    cout << endl;
}

这是使用临时对象的正确结果:

2, 5, 5, 0, 7, 10, 23, 23, 23, 57, 77, 

1 个答案:

答案 0 :(得分:7)

i == min出现时:

        vi[i] ^= vi[i];
        vi[i] ^= vi[i];
        vi[i] ^= vi[i];

相同
        vi[i] = 0;

可读性差,效率低,并且不如swap那样总会起作用。

您应该使用

std::swap(vi[i], vi[min]);