在很多時候,我們會使用到將兩個整型變量值進行互換,比如冒泡排序,通過判斷來將數組變量的值逐步交換,那么怎么交換值才能最有效最節省空間呢?
首先,我們會想到的,用一個零時變量來做中間的過度存儲空間,這是很容易想到的方法,實現如下:
int i = 10; //聲明變量 i,並給 i 賦值為10
int j = 20; //聲明變量 j,並給 j 賦值為20
int temp; //聲明零時變量temp
那么,我們要將變量 i 的值賦給變量 j ,就得通過零時變量temp存儲其中一個變量的值:
temp = i ; //將變量 i 值暫存於零時變量temp中,即temp = 10;
i = j ; //將變量 j 的值賦值給變量 i ,即 i = 20;
j = temp ; //將零時變量存放的值賦值給變量 j ,即 j = 10;
這樣,我們就完成了最簡單的值互換。
其次,既然我們需要互換的是int類型的變量,那么就可以進行數值運算及加減乘除來實現變量值的互換。
int i = 10; //聲明變量 i,並給 i 賦值為10
int j = 20; //聲明變量 j,並給 j 賦值為20
i = i + j; //將 i + j(10+20) 的和賦值給變量 i ,賦值后變量 i 的值為 30
j = i - j; //將 i - j(30-20) 的差賦值給變量 j ,賦值后變量 j 的值為 10
i = i - j; //再運算一次,將 i - j(30 - 10)的差賦值給變量 i ,賦值后變量 i 的值為 20
這樣,我們也完成了兩個變量值的互換,這樣的好處是不需要第三個變量參與,節省了運行內存。
最后,我們可以通過位運算中的異或運算(^)實現變量值的交換,異或運算是位運算,其規則是相同為0,不同為1,即1^0或0^1的取值為1,1^1或0^0的取值為0,實現如下:
int i = 10; //聲明變量 i,並給 i 賦值為10
int j = 20; //聲明變量 j,並給 j 賦值為20
//其中變量 i 的值為10,其二進制編碼為:0000 1010
//其中變量 j 的值為20,其二進制編碼為:0001 0100
i = i ^ j ; //即為 10 ^ 20 ,根據 ^ 的運算規則可知,其結果是 0001 1110 ,轉換成十進制為:24 + 23 + 22 + 2 = 30 ,
//並將30賦值給變量 i ,即 i = 30
j = i ^ j ; //即為 30 ^ 20,其結果是 0000 1010,轉換成十進制為10,並將結果賦值給變量 j ,即 j = 10
i = i ^ j ; //即為 30 ^ 10,其結果是 0001 0100,轉換成十進制為20,並將結果賦值給變量 i ,即 i = 20
這種方式不需要使用零時變量,且是通過位運算,增加了其運算速度。
總結,在完成代碼時,我們要在解決問題的同時思考更加高效率的解決方案,當然,我們也要明白不同方案的優點和缺點,雖然有些方案可以提高運行效率,比如上述的第三種方案,但是他沒有第一種方案直觀,並且效率也沒有說完全高太多,只要在可接受的運行時間和空間內解決問題,那么我們完全可以使用第一種更為簡單和直觀的方式解決問題。