CS2L12——冒泡排序

排序的基本概念

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列
常用的排序例子:

1
8 7 1 5 4 2 6 3 9

把上面的这个无序排列 变为 有序(升序或者降序)的序列的过程

  • 升序:从小到大,呈上升趋势
  • 降序:从大到小,呈下降趋势
1
2
1 2 3 4 5 6 7 8 9 (升序)
9 8 7 6 5 4 3 2 1 (降序)

在程序中 序列一般 存储在数组当中,所以 排序往往是对 数组内的元素 进行排序,把数组里面的内容变为有序的

1
int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };

排序算法的概念

排序算法(sorting algorithm)用于对一组数据按照特定顺序进行排列。
排序算法有着广泛的应用,因为有序数据通常能够被更高效地查找、分析和处理。

排序算法中的数据类型可以是整数、浮点数、字符或字符串等。
排序的判断规则可根据需求设定,如数字大小、字符 ASCII 码顺序或自定义规则。

冒泡排序

冒泡排序(bubble sort)通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。

设数组的长度为 nn ,冒泡排序的步骤为:

  1. 首先,对 nn 个元素执行“冒泡”,将数组的最大元素交换至正确位置
  2. 接下来,对剩余 n1n-1 个元素执行“冒泡”,将第二大元素交换至正确位置
  3. 以此类推,经过 n1n-1 轮“冒泡”后, 𝑛1𝑛 − 1 大的元素都被交换至正确位置
  4. 仅剩的一个元素必定是最小元素,无须排序,因此数组排序完成。

冒泡排序

简记为:两两相邻 不停比较 不停交换 比较n轮

冒泡排序的基本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
static void BubbleSort(int[] arr)
{
//外循环:未排序区间为 [0, i]
for (int m = 0; m < arr.Length - 1; m++)
{
//内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
for (int n = 0; n < arr.Length - 1; n++)
{
//第一步 比较数组中两两相邻的数,如果 第n个数 比n+1的数 大,他们就要交换位置
if (arr[n] > arr[n + 1])
{
//第二部 交换位置 使用中间临时变量交换
int temp = arr[n];
arr[n] = arr[n + 1];
arr[n + 1] = temp;
}
}
//第三步 换n轮
}
}

static void Main(string[] args)
{
Console.WriteLine("排序前:");
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i]);
Console.Write(' ');
}
Console.WriteLine();

BubbleSort(arr);

Console.WriteLine("排序后:");
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i]);
Console.Write(' ');
}
Console.WriteLine();
}

输出:

1
2
3
4
排序前:
8 7 1 5 4 2 6 3 9
排序后:
1 2 3 4 5 6 7 8 9

冒泡排序的优化实现

确定位置的数字是不用比较的,因此,确定了一轮后,极值(最大或者最小)已经放到了对应的位置(往后放)
所以 每完成 n 轮,后面位置的数就不用再参与比较了

然后,存在这种特殊情况,在前几轮就已经完成了排序,这种情况下,后续没必要再进行多余的比较。
因此,可以增加一个标志位 isSort​ 来监测这种情况,如果没有出现交换,则说明排序已完成,就立即返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
static void BetterBubbleSort(int[] arr)
{
bool isSort = false;
//第一步 如何比较数组中两两相邻的数
for (int m = 0; m < arr.Length - 1; m++)
{
isSort = false;
for (int n = 0; n < arr.Length - m - 1; n++)
{
//如果 第n个数 比n+1的数 大,他们就要交换位置
if (arr[n] > arr[n + 1])
{
isSort = true;
//第二部 交换位置 使用中间临时变量交换
int temp = arr[n];
arr[n] = arr[n + 1];
arr[n + 1] = temp;
}
}
//当一轮结束后,如果isSort这个标识 还是false
//则意味着排序已经完成
if (!isSort)
{
break;
}
//第三步 换n轮
}
}

static void Main(string[] args)
{
int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };
BetterBubbleSort(arr);
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
}

输出:

1
2
排序得到:
1 2 3 4 5 6 7 8 9