交換兩個變數值,但不使用第三個變數的演算法

來源:互聯網
上載者:User

此題目由一個 同事提出,當時自己並沒有答出來,後同事給講解的比較明了,遂做出筆記,一方面是對自己的思維方式的一種拓展,另一方面是一種記錄,記錄自己的學習經曆和 該演算法的具體原理。

題目:a=10,b=15,將a / b的值互換。

通常我們的做法是(尤其是在學習階段):定義一個新的變數,藉助它完成交換。代碼如下:
int a,b;
a=10; b=15;
int t;
t=a; a=b; b=t;
這種演算法易於理解,特別適合協助初學者瞭解電腦程式的特點,是指派陳述式的經典應用。在實際軟體開發當中,此演算法簡單明了,不會產生歧義,便於程式員之間的交流,一般情況下碰到交換變數值的問題,都應採用此演算法(以下稱為標準演算法)。

上面的演算法最大的缺點就是需要藉助一個臨時變數。那麼不藉助臨時變數可以實現交換嗎?答案是肯定的!

1) 算術運算
簡單來說,就是通過普通的+和-運算來實現。代碼如下:
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後。
它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。
具體過程:第一句“a=b-a”求出ab兩點的距離,並且將其儲存在a中;第二句“b=b-a”求出a到原點的距離(b到原點的距離與ab兩點距離之差),並且將其儲存在b中;第三句“a=b+a”求出b到原點的距離(a到原點距離與ab兩點距離之和),並且將其儲存在a中。完成交換。
此演算法與標準演算法相比,多了三個計算的過程,但是沒有藉助臨時變數。(以下稱為算術演算法)

該演算法還可以這樣做:

int a,b;

a=10;b=12;

a=a+b=22;

b=a-b=10;

a=a-b=12;

兩個減操作一個加操作,執行的先後順序不一樣,其原理也稍微有些區別,但根本原理是一樣滴。

3) 位元運算
通過異或運算也能實現變數的交換,這也許是最為神奇的,請看以下代碼:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此演算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使資料中的某些位翻轉,其他位不變。這就意味著任意一個數與任意一個給定的值連續異或兩次,值不變。
即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理可以得到a=b^a^a=b;輕鬆完成交換。

以上三個演算法均實現了不藉助其他變數來完成兩個變數值的交換,相比較而言算術演算法和位演算法計算量相當,地址演算法中計算較複雜,卻可以很輕鬆的實現大類型(比如自訂的類或結構)的交換,而前兩種只能進行整形資料的交換(理論上重載“^”運算子,也可以實現任意結構的交換)。

介紹這三種演算法並不是要應用到實踐當中,而是為了探討技術,展示程式設計的魅力。從中可以看出,數學中的小技巧對程式設計而言具有相當的影響力,運用得當會有意想不到的神奇效果。而從實際的軟體開發看,標準演算法無疑是最好的,能夠解決任意類型的交換問題

以上文章由同事講解及網路查詢資料共同整理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.