冒泡排序也称为交换排序,它的原理是从第一个元素开始,依次和它的后一个元素比较,如果大小顺序有误,则交换之后之后再进行比较,每一轮比较之后,可以冒出一个最大值或者最小值,放在待排序数列的最后面。对于长度为n的数组,我们需要对其进行n-1轮排序,每一轮的排序效果如下:

每一轮的比较逻辑如下,这里我们以第一轮为例,这一轮总共进行8次比较。

static int[] data = { 3, 5, 6, 45, 85, 745, 95, 74, 1 };
public static void Sort()
{
    int temp;
    for (int i = data.Length - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (data[j] > data[j + 1])
            {
                temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
            }
        }
    }
    Print(data);
}

改进版的冒泡排序

我们直到,冒泡排序不管数据是否已经完成排序,都会执行n(n-1)/2次,下面我们设计一个程序,使用“哨兵”模式在一轮扫描中,如果顺序都没有问题的话,提前终端排序。

static int[] data = { 3, 5, 6, 45, 85, 745, 95, 74, 1 };
public static void Sort()
{
    int temp;
    int flag = 0;
    for (int i = data.Length - 1; i > 0; i--)
    {
        flag = 0;
        for (int j = 0; j < i; j++)
        {
            if (data[j] > data[j + 1])
            {
                temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
                flag++;
            }
        }
        if (flag == 0)
        {
            break;
        }
    }
    Print(data);
}

示例代码地址

普通冒泡排序地址:https://gitee.com/jiamingyuanjin_admin/data_struct/blob/master/DataStruct/Sort/BubbleSort.cs
改进版冒泡排序地址 https://gitee.com/jiamingyuanjin_admin/data_struct/blob/master/DataStruct/Sort/BubbleSort2.cs