今天在寫快排的時候遇到一個問題,排序的結(jié)果中某些數(shù)字莫名被清零。
斷點調(diào)試之后發(fā)現(xiàn)原來是交換函數(shù)的問題惠遏。
大體上說,交換兩個數(shù)字的方法有三種骏啰。這里以交換數(shù)組中的兩個數(shù)字為例子做說明节吮。
- 中間參數(shù)。
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]
兩個數(shù)字是一樣的 透绩,對應(yīng)下標的數(shù)組元素會在 ② 處被清零。
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
相等的話帚豪,數(shù)字會在 ① 處被清零碳竟。
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的話瞭亮。老實本分的第一種方法永遠不犯錯。