总述
排序算法中分为十种排序算法,分别为:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、基数排序、桶排序。
其中冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序这七种属于比较排序。
本文先记录冒泡排序、选择排序这两种算法。
冒泡排序
冒泡排序是一种很简单的排序算法,流程如下:
-
从头开始比较每一对相邻的元素,将大的放在后面,一直比较到末尾,如此一趟便可确定最大的元素
-
再次循环上述操作,但是末尾元素即上次找到的最大值不参与本次循环,末端为上次最大值的前一个元素
图示如下
代码如下
但是目前这种方法是不论给出的数据如何都会从头至尾依次比较,但是设想如果尾部部分数据已经局部有序,其实可以不再对其进行比较。
冒泡优化
如果给出的数据已经是完全有序的话,那么在第一次遍历后就可以停止了,并不需要接下来继续一遍一遍的遍历。但是完全有序的情况出现的概率是很低的,所以优化的重点应该在于局部有序,即在一次遍历后如果可能确定从某个位置开始后都是有序的,则下次遍历的末端可以提前至局部有序的前一个索引。
冒泡排序完全有序
针对于完全有序的情况,如果在一趟的遍历中发现没有进行任何一次的元素交换,则可以认为数据已经完全有序,停止之后的循环遍历操作即可。
首先给出已经完全有序的数据,对未经优化的版本和完全有序的版本进行比较,发现确实性能强很多,因为省掉了很多的循环操作。
再次给出随机数据来比较,大体上来说是比较接近的,也是符合我们的设想,毕竟完全有序的可能性很低
冒泡排序部分有序
由于完全有序的情况很罕见,但是局部有序还是有可能的,所以对此的优化是记录最后一次交换的位置,下一次循环的末端就在这里。
这里依然先给出部分有序的数据来测试,结果还是很明显的
现在再次给出完全随机的数据(这时给出10w个数据来测试,上面都是1000个数据)
冒泡排序总结:
- 最坏、平均时间复杂度是O()
- 最好时间复杂度是O(n)
- 空间复杂度是O(1)
选择排序
选择排序流程:
- 从序列中找到最大的那一个,与末尾元素交换位置
- 忽略上次找到的最大的元素,重复上述步骤
同时进行测试
选择排序总结:
- 最好、最坏平均时间复杂度均为O()
- 空间复杂度是O(1)