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.结果图