兩兩比較待排序數據元素的大小,發現兩個數據元素的次序相反時即進行交換,直到沒有反序的數據元素爲止。
3.2. 排序過程:
設想被排序的數組R[1..N]垂直豎立,將每個數據元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R,凡掃描到違反本原則的輕氣泡,就使其向上"漂浮",如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下爲止
【示例】:
49 13 13 13 13 13 13 13
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97
3.3. 程序實現
程序支持順序和倒序排列。
/// <summary> /// 冒泡算法 /// </summary> /// <param name="abarray"></param> /// <param name="IsAscending">是否順序排序</param> /// <returns></returns> private static double[] BubbleArithmetic(double[] abarray ,bool IsAscending) { if(abarray.Length > 0 ) { for(int i = abarray.Length-1 ;i >=0 ;i--) { for(int j = i-1 ; j>=0 ; j--) { if(CheckAccordCondition(abarray[i],abarray[j],IsAscending)) { ExChangeValue(ref abarray[i],ref abarray[j]); } } } } return abarray; } /// <summary> /// 交換數據 /// </summary> /// <param name="A"></param> /// <param name="B"></param> private static void ExChangeValue(ref double A , ref double B) { double Temp = A ; A = B ; B = Temp ; } /// <summary> /// 是否符合條件 /// </summary> /// <returns></returns> private static bool CheckAccordCondition(double data1 ,double data2, bool IsAscending) { if(data1 > data2) { return IsAscending == true ? true :false; } else { return IsAscending == true ? false :true ; } } |