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

标签 c++ selection-sort

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

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

问题是当使用临时对象交换值时工作正常但使用 Xor 运算符我得到错误的结果!!

这是使用 Xor 运算符的输出:

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

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

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

最佳答案

i == min 你得到:

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

相同
        vi[i] = 0;

只是可读性差、效率低,而且不像 swap 那样通用,swap 总是有效。

你应该使用

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

关于c++ - 为什么在选择排序中使用 Xor 运算符交换对象不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910995/

相关文章:

Java:对数组列表进行排序并以二维数组形式返回

c++ - 移除模板参数包的最后一个类型

c++ - 在 Xcode 中使用类的前向声明时出错

c++ - 将 idl 文件导入 Visual Studio (C++)?

c - 递归选择排序在 C 中输出不正确的值

java - 实现双向选择排序的问题

c - 使用 srand 输入选择排序代码

c++ - SDL 插件库未正确链接

带有 OpenMP 线程安全随机数的 C++

python - 我应该如何调整下面的选择排序代码使其足以工作,同时看起来仍然有点相同? Python