1. 程式人生 > >swap 交換函式的四種寫法(轉載)

swap 交換函式的四種寫法(轉載)

轉載:mjrao—swap 函式的四種寫法
注:無意中看到了這篇文章,感覺挺有意思的,就把它轉載過來了,順便添加了自己的講解。

二話不說,上程式碼:

swap 函式的四種寫法

(1)經典型 --- 嫁衣法

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

(2)經典型改進版  --- 泛型法

void swap(void *a, void *b, size_t size)
{
    unsigned char *p = (unsigned char *)
a; unsigned char *q = (unsigned char *)b; unsigned char temp; while(size--) { temp = *p; *p = *q; *q = temp; p ++; q ++; } } (3)取巧型 --- 賦值法 void swap(int *a, int *b) { *a = *a + *b; *b = *a - *b; *a = *a - *b; } (4)詭異型 --- 邏輯運演算法 void swap(int
*a, int *b) { *a = *a ^ *b; *b = *b ^ *a; *a = *a ^ *b; }
  • 第一種:嫁衣法

這方法就不用細說了,新增一箇中間變數,完成交換。簡單粗暴,不過缺點也很明顯,就是輸入變數的資料型別要先了解,比較大的侷限性。
操作難度:★★★

  • 第二種:泛型法

這方法可以說是第一個方法的升級版,為了不被傳入引數的資料型別限制,採用了泛型。把傳入引數強制轉為字元型指標變數,然後再一個一個字元進行交換。
操作難度:★★★★

  • 第三種:賦值法

稱之為賦值法似乎有點名不符實。這方法看上去感覺有點怪怪的,不過道理很簡單。
舉個例子,有兩個數a=3

b=4,先進行加法運算a=a+b=3+4=7,然後b=a-b=7-4=3,這樣子b 就順利換了a 的值,再然後a=a-b=7-3=4 實現兩個引數值得交換。
例子中只是用了整型,但是可以用於其它的基本資料型別,也可以和第二種方法結合使用。
操作難度:★★★★

  • 第四種:邏輯運演算法

這方法就夠詭異了。由於計算機裡的資料最後都會以0 或者1 的形式儲存,那麼我們就可以在第三個方法的基礎上進行思想昇華,給程式碼新增靈性,根據邏輯異或運算(a^a=0)完成兩個數的交換。 結合泛型就可以使用所有資料型別了。
操作難度:★★★★★