随手刷题——06.实现一个简单的冒泡排序

48 阅读3分钟

定义

冒泡排序(Bubble Sort)是一种简单的排序算法,它通过比较相邻元素的大小来进行排序。具体地说,该算法重复地遍历要排序的数组,每次比较两个相邻的元素,如果它们的顺序错误就交换它们。这样一轮遍历后,数组中最大的元素就会被移动到最后面;然后再针对剩余的未排序元素进行下一轮遍历,直到所有元素都被排序。

冒泡排序的时间复杂度为 O(n^2),其中 n 是数组的长度。虽然冒泡排序非常简单,但当数组规模较小时,其表现还是很不错的。

原理解释

假设我们要按照数字从小到大排列,首先我们会看数组中的第一个数字和第二个数字哪个更小,先把小的数字放在前面,再比较后面的两个数字,同样把小的数字放在前面。这样一直比较到最后两个数字,如果它们的顺序不对就交换它们的位置。这样一轮比较下来,最小的数字就被排到了数组的第一个位置。

接着,我们再比较第二个数字和第三个数字,以此类推,重复进行这个过程,直到整个数组都排好序为止。

其实就像水里面有很多气泡一样,大的气泡会慢慢“浮”到上面,小的气泡就会慢慢“沉”到下面,这就是所谓的“冒泡排序”

初步实现

根据以上定义,我们可以初步实现一个简单的冒泡排序。

image.png

一些优化点

  1. 设置标志位优化

设置一个布尔类型的标志位,用来记录每轮冒泡操作是否进行了数据交换。如果某轮冒泡操作没有进行数据交换,则说明数组已经排好序,后续的比较操作可直接跳过,从而避免不必要的比较操作。

image.png

  1. 添加边界优化

每轮冒泡操作时,前面已经排好序的部分元素不需要再参与比较。因此,可以在内层循环中添加一个边界变量,用来表示需要比较的元素的范围。每次进行内层循环时,将范围限定在上一轮冒泡操作最后一个交换位置的相邻元素处即可

image.png

  1. 使用其它排序算法

测试用例

使用以下的测试用例,发现输出了我们想要的结果

image.png

总结

冒泡排序可以分为以下几个步骤:

  1. 使用双层循环,外层循环控制排序轮数,内层循环控制每一轮需要比较的两个元素。
  2. 在内层循环中,比较相邻的两个元素的大小关系,如果前面的元素大于后面的元素,则交换它们的位置。
  3. 每轮内层循环结束之后,判断本轮是否进行了数据交换。如果没有交换,说明数组已经存在顺序关系,可以直接退出循环。
  4. 在外层循环中,每进行一次排序的轮数,都可以将数组中已经排好序的部分(边界值)缩小一位。

在实现冒泡排序时,需要特别注意以下几个小tips:

  1. 小心数组的下标越界问题。
  2. 双层循环的嵌套次数,冒泡排序的时间复杂度为 O(n^2),对于大规模数据的排序可能会过慢。
  3. 内层循环的优化,可以添加一个标志位,记录每次冒泡操作是否进行了交换,以此来判断数组是否已经排好序。
  4. 外层循环的优化,可以使用变量来记录数组中已经排好序的部分位置,从而避免重复比较已经排序好的元素。

我后面继续更新随手刷题系列的(至少把十种常见的排序算法更新完),也欢迎各位在评论区讨论~