1. 程式人生 > >swap函式 的幾種實現與比較

swap函式 的幾種實現與比較

前沿

swap函式 用於交換 a ,b 兩個數。實現方法大同小異,其中不乏有好多版本,現在就其效能和可讀性略作分析。不對指出還望指正。。

探討:

其中的函式原型是:

(1) void swap(int &a,int &b);傳引用

(2)void swap(int *a,int *b);傳地址

下面就第二個函式原型分析,程式碼如下:


    #include <stdio.h>  
    #include <stdlib.h>  
    /** 
        使用中間變數tmp 
    */  
    void swap(int
*a,int *b) { int tmp = *a; *a = *b; *b = tmp; } /** 使用加減法計算 */ void swap1(int *a,int *b) { *a = (*a) + (*b) ; *b = (*a) - (*b); *a = (*a) - (*b) ; } /** 使用乘除法計算 */ void swap2(int
*a,int *b) { *a = (*a)*(*b) ; *b = (*a) / (*b); *a = (*a) / (*b) ; } /** 使用異或運算 */ void swap3(int *a,int *b) { *a = *a^*b; *b = *a^*b; *a = *a^*b; //可以這麼寫: *a^=*b^=*a^=*b; } int
main(void) { int a=2,b=3; printf("start a:%d , b:%d\n",a,b); swap(&a,&b); printf("swap a:%d , b:%d\n",a,b); a=2;b=3; swap1(&a,&b); printf("swap1 a:%d , b:%d\n",a,b); a=2;b=3; swap2(&a,&b); printf("swap2 a:%d , b:%d\n",a,b); a=2;b=3; swap3(&a,&b); printf("swap3 a:%d , b:%d\n",a,b); return 0; } /** 執行結果: start a:2 , b:3 swap a:3 , b:2 swap1 a:3 , b:2 swap2 a:3 , b:2 swap3 a:3 , b:2 */

實現:

這裡總結了4個swap()函式的實現方法,前三個我就不詳細說了,分別用了:中間變數法,加減法,乘除法。相信我不說大家也能看得懂。我主要說一下第四種方法——異或法。

這裡的異或法是利用了高等數學中的知識:

對任意數 A ,B ,C

(1)A ^ 0 = A

(2)A ^ A = 0

(3)(A ^B)^C=A^(B^C)

(4)A^B = B^A

這三條常識:

我們看到函式swap3()中,我們姑且將這兩個引數成為a,b

第一句 a = a^b; 咱們讓 c =a^b;

第二句 b = a^b;其時就是 b = c^b =a^(b^b)=a^0=a;

第三句 a = a^b;其時就是 a = c^b =a^b^a=b^(a^a)=b^0=b;

這樣就給交換過來了。。。。。

分析:

效能分析:

    (1)空間效能

    (2)時間效能

    這其實沒啥說的

    空間效能上swap()浪費一個int 空間,其他沒有空間開銷。

    時間效能上,雖然說都是執行3條語句,但是與語句不一樣,效率上 :位運算>加減>乘除 (大致上是這樣,具體情況還得具體分析)

    所以swap3()技高一籌。。。。。。

穩定性:

    是不是這幾個函式一定正確???呵呵。這可不一定,引數是int型別

    swap1() swap2()  你想想看。。可能造成溢位的。。

    事實的確是這樣 當a =2100000001 b=2100000002

    你試一下。。呵呵。。swap() 和swap3()依然堅挺。。而swap1() ,swap2() 。。。完了。。

可讀性:

    swap()當之無愧是最好的。。可讀性是最好的。。

總結:

綜上所述:建議大家使用swap3(異或) ,swap(中間變數)。。。

相關推薦

swap函式實現比較

前沿 swap函式 用於交換 a ,b 兩個數。實現方法大同小異,其中不乏有好多版本,現在就其效能和可讀性略作分析。不對指出還望指正。。 探討: 其中的函式原型是: (1) void swap(int &a,int &b);傳引

Excel多人同時編輯的方案比較

就會 6.4 電子表格 onedrive oss 流程 系統管 擴大 使用 1、寫在前面的話 本人從事信息化工作多年,對Excel等電子表格的多人同時編輯接觸較早,幫助客戶實施的方案也較多,因此有些體會和認識。正好看到網上這方面的討論較多,但都不完整,我就進一步做了專題調

Matlab 卷積的實現比較(convfilter,conv2filter2,imfilter)

</pre><pre name="code" class="cpp"></pre></h1><h1><span style="font-size:18px;">1 filter</span></h1><sp

C/C++——strcpy函式 實現 和 詳細 解析

C/C++——strcpy函式的實現 和解析 題目:      已知strcpy函式的原型是:         &nb

[原始碼和文件分享]基於C++的9排序演算法的實現比較

一、使用說明 1.1 專案簡介 隨機函式產生10000個隨機數,用快速排序,直接插入排序,氣泡排序,直接選擇排序的排序方法排序,並統計每種排序所花費的排序時間和交換次數。其中,隨機數的個數由使用者定義,系統產生隨機數,並且顯示他們的比較次數,排序演算法包括氣泡排序,直接選擇排序,直接插入排序

C語言中求字串長度的函式my_strlen()的實現方法

C語言中求字串長度的函式的幾種實現方法 1.最常用的方法是建立一個計數器,判斷是否遇到‘\0’,不是’\0’指標就往後加一。 int my_strlen(const char *str) { assert(str != NULL);//此句判段str是否為空指標(事實上這條語

java.util.Timer、QuartzSpring task定時器任務的實現方法

轉載:https://www.jb51.net/article/106445.htm 一.分類 從實現的技術上來分類,目前主要有三種技術(或者說有三種產品): 1.Java自帶的java.util.Timer類,這個類允許你排程一個java.util.TimerTask任務。使用這種方式

java的list實現方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java時間戳的三獲取方式比較

一、list簡介 List列表類,順序儲存任何物件(順序不變),可重複。 List是繼承於Collection的介面,不能例項化。例項化可以用: ArrayList(實現動態陣列),查詢快(隨

C++返回字串函式實現方法

C++返回字串函式有四種方式: 1。使用堆空間,返回申請的堆地址,注意釋放 2。函式引數傳遞指標,返回該指標 3。返回函式內定義的靜態變數(共享) 4。返回全域性變數 1.使用堆空間,返

PLSql -- 遞迴查詢的另實現方式(函式/儲存過程)

問題 這是一個樹結構,查詢教師“胡明星”的所有主管及姓名:(無主管的教師也需要顯示),顯示(教師編號、教師名稱、主管編號、主管名稱) 解決1 declare v_tno hand_t

kaggle 泰坦尼克號生存預測——六演算法模型實現比較

Hi,大家好,這是我第一篇部落格。 作為非專業程式小白,部落格內容必然有不少錯誤之處,還望各位大神多多批評指正。 在開始正式內容想先介紹下自己和一些異想天開的想法。 我是一名研究生,研究的方向是蛋白質結構與功能方向。在研究過程中發現生物系統是如此複雜,猶如一張網,資訊流動,

交換函式swap的三實現方法

本文采用三種方式實現兩個數之間的交換,分別是①藉助輔助變數temp的swap函式,②採用加減法的swap函式 ,③使用異或運算的swap函式。 現在直奔主題: 1、藉助輔助變數temp的swap函式

詳解單頁面路由的實現原理

htm 缺點 服務 ajax請求參數 重復 情況 路由 dem history 路由是每個單頁面網站必須要有的,本篇基本不會天貼代碼,只講原理,代碼在頁面底會有github地址,註意,一定要放在本地服務器裏跑(因為有AJAX) 眾所周知,單頁面網站的路徑跳轉全是通過JS來控

多線程有實現方法?同步有實現方法?(被問到)

所有 正在 () read 異常 同步 -h 競爭 sync 多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口 同步的實現方面有兩種,分別是synchronized,wait與notify wait():使一個線程處於等待狀態,並且釋放所持有的對象的

Spring定時任務的實現

job 將不 obb 簡單 信息 sim ger 觸發 一個 Spring定時任務的幾種實現: 近日項目開發中需要執行一些定時任務,比如需要在每天淩晨時候,分析一次前一天的日誌信息,借此機會整理了一下定時任務的幾種實現方式,由於項目采用spring框架,所以我都將結合 sp

轉 Spring定時任務的實現 (記錄備用)

官方 ini src def lns 開發 enc http poj http://gong1208.iteye.com/blog/1773177 Spring定時任務的幾種實現 近日項目開發中需要執行一些定時任務,比如需要在每天淩晨時候,分析一次前一天的日誌信息,借此

單例模式的實現方式

str 類加載 代碼 創建對象 stat 懶漢 導致 方法 不支持 1、懶漢式,線程不安全 是否 Lazy 初始化:是 是否多線程安全:否 實現難度:易 描述:這種方式是最基本的實現方式,這種實現最大的問題就是不支持多線程。因為沒有加鎖 synchronized,所以嚴格意

交換函數swap的三實現方法

tools view art pbo class -m tails 鏈接 clip http://blog.csdn.net/GarfieldEr007/article/details/48314295 本文采用三種方式實現兩個數之間的交換,分別是①借助輔助變量temp的s

分布式session的實現方式

服務器 單點 redis 容易 穩定性 常用 str 廣播 cati 1.基於數據庫的session共享 2.基於NFS共享文件系統 3.基於memcached 的session,怎麽保證session的高可用 4.基於resin/tomcat web容器本身的sessio

談談使用Redis緩存時批量刪除的實現

cursor 時也 ons 純粹 rod 依據 大致 比較 根據 前言 在使用緩存的時候,我們時不時會遇到這樣一個需求,根據緩存鍵的規則去批量刪除這些數據,比較常見的就是按前綴去刪除。 舉個簡單的例子,Redis中現在有幾百個商品的數據,這些數據的key值是有一定規律的,都