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 幾種卷積的實現與比較(conv與filter,conv2與filter2,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、Quartz與Spring 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值是有一定規律的,都