C++中兩種交換變數值方法的時間測試
阿新 • • 發佈:2020-09-01
常見的交換兩個變數值的方法有三種:
- 最常見的一種方法是,利用臨時變數,交換兩個變數的值。這種方法在生活中也很常見,假設有一個杯子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
從輸出結果可以看出,最常用的第一種方法,執行速度最快。後兩種方法均慢於第一種方法,且兩種方法的執行速度基本無差異。而第一種方法的可讀性是最好的,所以在實際應用中,應該儘可能採取第一種方法。
如文章內容有錯誤,歡迎在評論中指正