1. 程式人生 > 實用技巧 >C++中兩種交換變數值方法的時間測試

C++中兩種交換變數值方法的時間測試

常見的交換兩個變數值的方法有三種:

  • 最常見的一種方法是,利用臨時變數,交換兩個變數的值。這種方法在生活中也很常見,假設有一個杯子A,其中有盛有飲料a,另有一個杯子B,其中盛有飲料b,如果我們想要把A和B兩個杯子裡的飲料對調,會藉助一個空杯子C,先把A中的飲料a倒在空杯子C中,C中有了飲料a,於是A變成了空杯子,這時把B中的飲料b倒在A中,於是A中有了飲料b,B成了空杯子,最後將C中的飲料a倒在B中,B中有了飲料a,此時完成對調。
  • 第二種方法是,利用數值異或運算兩次不變的性質,交換兩個變數值。這種方法不用藉助臨時變數,不會消耗額外的儲存空間。
  • 第三種方法是,利用兩數之和減去一個數等於另一個數的性質,交換兩個變數值。例如,10+1=11,10在前,1在後,通過11-10=1與11-1=10的變換後,1在前,10在後,兩數完成交換。這種方法同樣不用藉助臨時變數,不會消耗額外的儲存空間。

而現代計算機中,演算法的空間佔用往往不是人們主要關心的問題,人們最關心的,是演算法執行的快慢。因此我們可以利用程式測試一下,這三種交換變數值的方法究竟哪種會更快一些。

C++的程式碼實現:

#include <iostream>
#include <stdlib.h>
#include <ctime>
#define N 100000001
using namespace std;

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

void swap_b(int *a, int *b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

void swap_c(int *a, int *b)
{
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

int main()
{
    int a = 1;
    int b = 10;

    // 藉助臨時變數
    cout << "藉助臨時變數交換兩變數值" << endl;
    clock_t start_time = clock();
    for (int i = 0; i < N; i++)
    {
        swap_a(&a, &b);
    }

    clock_t end_time = clock();
    cout << "a:" << a << "\nb:" << b << "\ntime:" << end_time - start_time << endl;

    // 使用異或運算
    cout << "\n使用異或運算交換兩變數值" << endl;
    start_time = clock();
    for (int i = 0; i < N; i++)
    {
        swap_b(&a, &b);
    }

    end_time = clock();
    cout << "a:" << a << "\nb:" << b << "\ntime:" << end_time - start_time << endl;

    // 兩數求和相減
    cout << "\n兩數求和相減交換兩變數值" << endl;
    start_time = clock();
    for (int i = 0; i < N; i++)
    {
        swap_c(&a, &b);
    }

    end_time = clock();
    cout << "a:" << a << "\nb:" << b << "\ntime:" << end_time - start_time << endl;

    system("pause");
    return 0;
}

輸出結果:

藉助臨時變數交換兩變數值
a:10
b:1
time:713

使用異或運算交換兩變數值
a:1
b:10
time:934

兩數求和相減交換兩變數值
a:10
b:1
time:936

從輸出結果可以看出,最常用的第一種方法,執行速度最快。後兩種方法均慢於第一種方法,且兩種方法的執行速度基本無差異。而第一種方法的可讀性是最好的,所以在實際應用中,應該儘可能採取第一種方法。

如文章內容有錯誤,歡迎在評論中指正