作者: mhhsu (Set Limitation ) 看板: Lang_C
標題: [C]SWAP(a,b)
時間: Sun Nov 15 02:03:47 1998
關於交換兩個數的方法,今天在「小魚」哪裡看到了四種。
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
int main(void) {
int a=1,b=2,c;
SWAP(a,b,c);
return(0);
}
swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
template <class T>
void SWAP(class T &a, class T &b)
{
class T temp;
temp = a;
a = b;
b = temp;
}
void _swap(char *x, char *y, int sz)
{
char c;
while (sz-- > 0) {
c = *x;
*x++ = *y;
*y++ = c;
}
}
=============================================
以上都寫的很不錯 ^_^
不過,演算法都大同小異囉
我來現個醜,提供第五種
void SWAP(int *a,int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
//一樣用三列啦!不過只需兩個變數
--
Anyway, Do the right thing.m
--
※ Origin: 程式設計樂園 ◆ From: r215-77.D5-214.ncu.edu.tw
--
你是一位聰明人嗎?如果是,你該記住,你的聰明是跟那些人學來的,
然後在適當的地點,適當的時間,輕輕的對那人說:這是你教我的。
聲音要輕,而且只告訴他一個人。
摘錄自"牧羊少年奇幻之旅"
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: DickG.m5.ntu.ed
> -------------------------------------------------------------------------- <
作者: DavidYu ( ) 看板: C_and_CPP
標題: Re: [轉錄] swap
時間: Thu Nov 19 06:59:51 1998
※ 引述《DickG (龍龍)》之銘言:
: 關於交換兩個數的方法,今天在「小魚」哪裡看到了四種。
還有一種,
a ^= b, b ^= a, a ^= b;
很有趣...不知道是誰想到的...^^;;
--
Chia-Hsing David Yu
davidyu@ken.csie.ntu.edu.tw
Welcome to 瘋橋驛站 -- oio.m1.ntu.edu.tw
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: oio.m1.ntu.edu.
> -------------------------------------------------------------------------- <
作者: cying (應) 看板: C_and_CPP
標題: Re: [轉錄] swap
時間: Thu Nov 19 11:07:57 1998
※ 引述《DavidYu ( )》之銘言:
: ※ 引述《DickG (龍龍)》之銘言:
: : 關於交換兩個數的方法,今天在「小魚」哪裡看到了四種。
: 還有一種,
: a ^= b, b ^= a, a ^= b;
: 很有趣...不知道是誰想到的...^^;;
還有阿:
a=a+b
b=a-b
a=a-b
這樣推理下去的話可以有n個變數
a=a+b+c
b=a-b-c
c-a-b-c
a=a-b-c
就可以對a,b,c三個值做「旋轉」處理完後
b變成原來的a,c變成原來的b,a變成原來的c
這是在某年比賽的筆試中看到的...相當有趣
> -------------------------------------------------------------------------- <
作者: hotball (哲哲魚) 看板: C_and_CPP
標題: Re: [轉錄] swap
時間: Fri Nov 20 02:26:21 1998
※ 引述《DeanL (遠距通訊)》之銘言:
: ※ 引述《hotball (哲哲魚)》之銘言:
: : 其實這些方法都是早期的電腦常用的方法,因為那時記憶體不多,多用一個 temp
: : 變數似乎太奢侈了,所以才發明了這些方法。不過在當時的電腦上,這些方法會
: : 比用 temp 變數的方法慢一些。
: : 後來的電腦幾乎都會把 swap 的指令做進去,就不需要再這樣做了。
: : 聰明的 compiler 會試圖把「實際上」在做 swap 動作的 code 改成用 swap 指
: : 令去做……
: 意思是不是把code寫得簡單一點,讓compiler看得懂...
: 然後他才可以幫你optimize??
: 為什麼C不內建swap的function呢??
其實要做這麼聰明的 compiler 是很困難的(我也不確定有沒有這種東西)
不過你的第二個問題有點怪怪的……如果 C 要內建 swap 的 function,
那要內建哪種 type 的 swap function?int?還是?
當然在 C++ 裡面有一個 swap 的 template function,不過它基本上是用
t = a; a = b; b = t; 的這種方式寫的。也許有些 implementation 會針對
某些 type (如 int)做 optimization,但是效果可能就很有限。
(要注意絕大部分的 CPU 不能直接 swap 兩個記憶體位址,而所有的變數
理論上是存在記憶體中的)
所以大部分的 compiler 會做到的頂多就是把 t 去掉(例如,它可能會產生:
A dd 10
B dw 20
...
mov eax, A
mov ebx, B
mov A, ebx
mov B, eax
事實上,當你在 Visual C++ 6.0 裡面寫 t=a; a=b; b=t; 時,它就會這麼做。
(其實也沒有更快的方法)不過,如果寫 a += b; b= b-a; a-=b; 的話,它就
看不出來了,會真的去算那些數值。這樣就反而比較慢。
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: kimicat.m1.ntu.