1、用第三個變數值交換
int a = 1;
int b = 2;
int c = a;
a = b;
b = c;
2、用加減法交換
a = a + b;
b = a - b;
a = a - b;
或
a = a - b;
b = a + b;
a = b - a;3、用異或(XOR)法交換
a = a ^ b;
b = a ^ b;
a = a ^ b;詳細可看codeproject上一篇文章 <<神奇的異或 The Magical Exclusive OR (XOR)>>下面我們要在冒泡排序演算法中測試一下這三種交換方法的效率
| 代碼如下 |
複製代碼 |
public enum EChangeType { /// <summary> /// 用第三方變數temp進行前後值交換 /// </summary> ThridVar, /// <summary> /// 用a=a+b;b=a-b;a=a-b 計算方法進行前後值交換 /// </summary> Js, /// <summary> /// 用a=a^b;b=a^b;a=a^b 計算方法進行前後值交換 /// </summary> XOR }/// <summary> /// 冒泡排序演算法: /// a、首先將所有待排序的數字放入工作列表中 /// b、從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換 /// c、重複2號步驟,直至再也不能交換 /// </summary> public class BubbleSort { public void Sort(int[] arrInt, EChangeType type) { System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); st.Start(); int count = 0; int temp; bool hasExchangeAction; //記錄此次大迴圈中相鄰的兩個數是否發生過互換(如果沒有互換,則數組已經是有序的) for (int i = 0; i < arrInt.Length - 1; i++) { count++; hasExchangeAction = false; //每次大迴圈都假設數組有序 for (int j = i + 1; j < arrInt.Length; j++) { count++; if (arrInt[i] > arrInt[j]) { switch (type) { case EChangeType.ThridVar: temp = arrInt[i]; arrInt[i] = arrInt[i + 1]; arrInt[i + 1] = temp; break; case EChangeType.Js: arrInt[i] = arrInt[i] + arrInt[j]; arrInt[j] = arrInt[i] - arrInt[j]; arrInt[i] = arrInt[i] - arrInt[j]; break; case EChangeType.XOR: arrInt[i] = arrInt[i] ^ arrInt[j]; arrInt[j] = arrInt[i] ^ arrInt[j]; arrInt[i] = arrInt[i] ^ arrInt[j]; break; default: break; } hasExchangeAction = true; //發生過互換 } } if (!hasExchangeAction) //如果沒有發生過互換,則數組已經是有序的了,跳出迴圈 { break; } } st.Stop(); switch (type) { case EChangeType.ThridVar: Console.WriteLine("用第三方變數temp進行前後值交換:"); break; case EChangeType.Js: Console.WriteLine("用a = a + b; b = a - b; a = a - b;(或a = a - b; b = a + b; a = b - a;) n計算方法進行前後值交換:"); break; case EChangeType.XOR: Console.WriteLine("用a = a ^ b; b = a ^ b; a = a ^ b; 計算方法進行前後值交換:"); break; default: break; } Console.WriteLine("迴圈總數:{0} 排序耗時:{1}{2}", count, st.ElapsedMilliseconds,Environment.NewLine); } } static void Main(string[] args) { List<int> list = new List<int>(); for (int i = 100 * 100; i >= 0; i--) { list.Add(i); } Console.WriteLine("對100 * 100個數字進行冒泡排序{0}", Environment.NewLine); new BubbleSort().Sort(list.ToArray(), EChangeType.ThridVar); new BubbleSort().Sort(list.ToArray(), EChangeType.Js); new BubbleSort().Sort(list.ToArray(), EChangeType.XOR); Console.ReadLine(); }結果 |
人生無處不PK