不引入变量 异或交换的缺点
文章目录
- 选择排序正确代码
- 交换两个数位置的方法
- 引入中间变量
- 不引入中间变量,使用异或的方法
- 错误原因
- 优化代码
选择排序正确代码
// 数组中交换i和j位置的数public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}// 选择排序//选择待排数据中最小的,与数组最左侧的数据进行交换public static void selectionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int minIndex, i = 0; i < arr.length - 1; i++) {minIndex = i;//因为每一次都会排好前面的位置,所以每次 都要重新给minIndex赋值; 然后数组剩余数字进行遍历,找出最小值然后交换for (int j = i + 1; j < arr.length; j++) {//当 j = i 时,会无意义地比较 arr[i] 和 arr[minIndex](此时 minIndex = i),即 arr[i] 和自己比。if (arr[j] < arr[minIndex]) {minIndex = j;}}swap(arr, i, minIndex);}}
交换两个数位置的方法
引入中间变量
正确,可以使用
public static void swap(int[] arr,int i,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}
不引入中间变量,使用异或的方法
这种方法有问题不能使用!!
public static void swap(int[] arr,int i,int j){arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}
错误原因
异或交换不能处理i == j的情况,会导致数据被错误地置 0。
因此使用时 我们推荐先判断两数是否相等