C#數據結構與算法系列(十八):冒泡排序算法(BubbleSort)

1.介紹

冒泡排序的基本思想就是:通過對待排序序列從前向後(從下標較小的元素開始),依次比較相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向後部,就像水底的氣泡一樣逐漸向上冒泡。

因為排序的過程中,各元素不斷接近自己的位置,如果一趟比較下
來沒有進行過交換,就說明序列有序,因此要在排序過程中設置
一個標誌flag判斷元素是否進行過交換。從而減少不必要的比較。(這裡說的優化,可以在冒泡排序寫好後,在進行)

2.圖解

 

 3.代碼實現

using System;

namespace DataStructure
{
    public class BubbleSort
    {
        /// <summary>
        /// 測試
        /// </summary>
        public static void Test()
        {
            int[] arr = { 3, 9, -1, 10, 20 };

            Console.WriteLine("排序的數組:" + ArrayToString(arr));

            Console.WriteLine("\n優化後的數組排序");

            Sort(arr);

            Console.WriteLine("\n優化前的數組排序");

            arr = new int[] { 3, 9, -1, 10, 20 };

            for (int i = 0; i < arr.Length - 1 - 0; i++)
            {
                int temp = 0;

                if (arr[i] > arr[i + 1])
                {
                    temp = arr[i];

                    arr[i] = arr[i + 1];

                    arr[i + 1] = temp;
                }
            }

            System.Console.WriteLine("\n第一次排序的結果:" + ArrayToString(arr));

            for (int i = 0; i < arr.Length - 1 - 1; i++)
            {
                int temp = 0;

                if (arr[i] > arr[i + 1])
                {
                    temp = arr[i];

                    arr[i] = arr[i + 1];

                    arr[i + 1] = temp;
                }
            }
            System.Console.WriteLine("\n第二次排序的結果:" + ArrayToString(arr));

            for (int i = 0; i < arr.Length - 1 - 2; i++)
            {
                int temp = 0;

                if (arr[i] > arr[i + 1])
                {
                    temp = arr[i];

                    arr[i] = arr[i + 1];

                    arr[i + 1] = temp;
                }
            }
            System.Console.WriteLine("\n第三次排序的結果:" + ArrayToString(arr));


            for (int i = 0; i < arr.Length - 1 - 3; i++)
            {
                int temp = 0;

                if (arr[i] > arr[i + 1])
                {
                    temp = arr[i];

                    arr[i] = arr[i + 1];

                    arr[i + 1] = 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 = 0; 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 = 0;

            //要排序的次數,arr.Length-1 
            for (int i = 1; i < arr.Length; i++)
            {
                //第幾次排序
                for (int j = 0; j < arr.Length - i; j++)
                {
                    //如果前面的數大於後面的數,則交換
                    if (arr[j] > arr[j + 1])
                    {
                        flag = true;

                        temp = arr[j];

                        arr[j] = arr[j + 1];

                        arr[j + 1] = temp;
                    }
                }
                //每次排序的結果
                System.Console.WriteLine("\n第" + i + "次排序的結果:" + ArrayToString(arr));

                if (!flag) break; //在一趟排序中,一次交換都沒有發生過

                else flag = false; //重置flag進行下次判斷

            }
        }
    }
}

4.結果圖