今天在写快排的时候遇到一个问题,排序的结果中某些数字莫名被清零。
断点调试之后发现原来是交换函数的问题。
大体上说,交换两个数字的方法有三种。这里以交换数组中的两个数字为例子做说明。
- 中间参数。
void swap(int[] array,int a,int b){
int tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
- 加减法。注意这里的一个问题:如果
i
和j
相等的话array[i]
和array[j]
两个数字是一样的 ,对应下标的数组元素会在 ② 处被清零。
void exchange(int[] array, int i, int j) {
array[i] = array[i] + array[j];
array[j] = array[i] - array[j]; //②
array[i] = array[i] - array[j];
}
- 位运算。这里需要注意的是如果
i
和j
相等的话,数字会在 ① 处被清零。
void exchange(int[] array, int i, int j) {
array[i] = array[i] ^ array[j]; //①
array[j] = array[i] ^ array[j];
array[i] = array[i] ^ array[j];
}
所以,还是不要写太炫酷的代码,如果不清楚里面的tricks的话。老实本分的第一种方法永远不犯错。
网友评论