冒泡排序也称为交换排序,它的原理是从第一个元素开始,依次和它的后一个元素比较,如果大小顺序有误,则交换之后之后再进行比较,每一轮比较之后,可以冒出一个最大值或者最小值,放在待排序数列的最后面。对于长度为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