C#資料結構與算法系列(十八):氣泡排序演演算法(BubbleSort)
阿新 • • 發佈:2020-06-26
1.介紹
氣泡排序的基本思想就是:通過對待排序序列從前向後(從下標較小的元素開始),依次比較相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向後部,就像水底的氣泡一樣逐漸向上冒泡。
因為排序的過程中,各元素不斷接近自己的位置,如果一趟比較下
來沒有進行過交換,就說明序列有序,因此要在排序過程中設定
一個標誌flag判斷元素是否進行過交換。從而減少不必要的比較。(這裡說的優化,可以在氣泡排序寫好後,在進行)
時間複雜度:O(n^2)
2.圖解
3.程式碼實現
using System; namespace DataStructure
{
public class BubbleSort{
/// <summary>
/// 測試
/// </summary>
public static void Test()
{
int[] arr = { , , -, , }; Console.WriteLine("排序的陣列:" + ArrayToString(arr)); Console.WriteLine("\n優化後的陣列排序"); Sort(arr); Console.WriteLine("\n優化前的陣列排序"); arr = new int[] { , , -, , }; for (int i = ; i < arr.Length - - ; i++){
int temp = ; if (arr[i] > arr[i + ])
{
temp = arr[i]; arr[i] = arr[i + ]; arr[i + ] = temp;
}
} System.Console.WriteLine("\n第一次排序的結果:" + ArrayToString(arr)); for (int i = ; i < arr.Length - - ; i++){
int temp = ; if (arr[i] > arr[i + ])
{
temp = arr[i]; arr[i] = arr[i + ]; arr[i + ] = temp;
}
}
System.Console.WriteLine("\n第二次排序的結果:" + ArrayToString(arr)); for (int i = ; i < arr.Length - - ; i++)
{
int temp = ; if (arr[i] > arr[i + ])
{
temp = arr[i]; arr[i] = arr[i + ]; arr[i + ] = temp;
}
}
System.Console.WriteLine("\n第三次排序的結果:" + ArrayToString(arr)); for (int i = ; i < arr.Length - - ; i++)
{
int temp = ; if (arr[i] > arr[i + ])
{
temp = arr[i]; arr[i] = arr[i + ]; arr[i + ] = temp;
}
}
System.Console.WriteLine("\n第四次排序的結果:" + ArrayToString(arr));
} /// <summary>
/// 將陣列轉換成String
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
public static string ArrayToString(int[] arr)
{ string result = ""; for (int i = ; i < arr.Length; i++)
{
result += arr[i] + ",";
} return result;
}
/// <summary>
/// 排序演演算法優化並封裝
/// </summary>
/// <param name="arr"></param>
public static void Sort(int[] arr)
{
//標識標量,表示是否被交換過
bool flag = false; //臨時變數
int temp = ; //要排序的次數,arr.Length-1
for (int i = ; i < arr.Length; i++)
{
//第幾次排序
for (int j = ; j < arr.Length - i; j++)
{
//如果前面的數大於後面的數,則交換
if (arr[j] > arr[j + ])
{
flag = true; temp = arr[j]; arr[j] = arr[j + ]; arr[j + ] = temp;
}
}
//每次排序的結果
System.Console.WriteLine("\n第" + i + "次排序的結果:" + ArrayToString(arr)); if (!flag) break; //在一趟排序中,一次交換都沒有發生過 else flag = false; //重置flag進行下次判斷 }
}
}
}