大家好,我是你们的才辰。
众所周知,十大排序算法是我们必须掌握的算法。这里我先把十个算法的名称列一下:
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 基数排序
- 堆排序
- 桶排序
- 计数排序
因为我想建立一个比较完整的知识体系,所以对于比较简单基础的知识我也会写。对于已经学会的小伙伴就当做回顾一下吧。
话不多说,直接开始。今天整理了一下比较简单的冒泡排序。
准备
在介绍算法之前,先简单解释几个概念:
- 时间复杂度:一个算法执行所消耗的时间
- 空间复杂度:运行一个算法所消耗的内存大小
- 是否是稳定排序:如果在排序前a=b,a在b前面,排序后a仍在b前面,则为稳定排序;如果在排序前a=b,a在b前面,排序后a有可能在b后面,则为非稳定排序。
算法解释
冒泡排序是一个比较经典的排序算法。我先用文字解释一下算法的过程,然后结合一个具体的实例来加深理解,最后给出了算法代码。
对于一组包含n个数据的数组,冒泡排序在最坏情况下要进行n趟排序(也可以说是n-1趟,因为最后一次遍历可以省略):
第一趟:依次比较下标为0和1、1和2、2和3,n-2和n-1的元素,如果第一个元素大于第二个元素,则交换它们,否则不交换。经过一次遍历后,最大的元素排到了最后;
第二趟:依次比较下标为0和1、1和2、2和3,n-3和n-2的元素,如果第一个元素大于第二个元素,则交换它们,否则不交换。经过第二次遍历后,第二大的元素排到了倒数第二个位置;
.......
第n-1趟:比较下标为0和1的元素,如果第一个元素大于第二个元素,则交换它们,否则不交换。经过第n-1次遍历后,第二小的元素排到了第二个位置;
第n趟:此时下标为0的元素就是最小元素,排序结束。
实例
直接讲解算法的过程比较抽象,我打算结合一个具体的实例来讲解。
假设有一个数组arr={6,2,4,8,3}
第一步:首先把第一个元素和第二个元素比较,如果第一个比第二个大,就交换两个数的位置。arr[0]=6,arr[1]=2,6>2,故交换两个数的位置;
接着将第二个数和第三个数比较,如果第二个数大于第三个,则交换它们的位置;6>4,交换位置;
接着比较6和8,6<8,不用交换位置,接下来比较8和3,8>3,交换位置。这样,就完成了一次遍历;
接下来开始第二次遍历,过程和第一次相同,唯一区别就是最后一个元素8不再参与比较。2<4,4<6,不用交换位置,接着6>3,交换位置,第二次遍历结束。结果如下:
这样,元素6就放在了正确位置。
接下来遍历2-4-3,将元素4放在了正确位置;
接下来遍历2-3,将元素3放在了正确位置;
接下来只剩下1个元素2,自然就是有序的。
代码实现
时间复杂度:O(n*n)
空间复杂度:O(1)
是否是稳定排序:是
优化
在遍历过程中,如果数组已经是有序的,则剩下的遍历过程可以省略,这样可以节省时间。
例如在上面的例子中,第3次遍历之后,数组已经是有序的,则可以省略后两次的遍历。
优化方法就是判断在某一次遍历中是否有数据进行交换,若没有则表明排序已经完成。为此,可以定义一个标志变量,用来判断一次遍历过程是否有数据交换。
最后,学习更多算法+计算机基础知识,欢迎来公众号【编程365】找我哦。