什么是排序?
这个就不说了
如何评价排序?
我们规定下定义一个排序算法好坏的维度。
1.执行效率
这里对于效率的概念可以分为两部分,一部分是执行时间,另一部分就是比较和交换的次数(也可以归结到时间里去)。
时间其实就是时间复杂度,很好理解,就是时间复杂度越小的算法,我们认为越好。
比较和交换的次数我们后续会引入一个概念叫做有序度和逆序度。
这个有序度逆序度是一个对的概念。每次只比较一对数字。有序即左小右大,逆序即左大右小。
还有一个满有序度(即完全排好的),可想而知满有序度 = n*(n-1)/2 = 有序度+逆虚度
2.内存消耗
消耗内存空间的大小其实就是空间复杂度的概念,这里引入一个概念叫原地排序(我不动),简单来说就是空间复杂度O(1)的排序算法。
3.是否稳定
是否稳定的意思就是,比如说我两个相同的数字还要不要换位置。我们把不需要换位置的算法称为稳定算法,需要换的算法称为不稳定算法。
冒泡排序
冒泡排序每次只涉及相邻的2个元素,两个元素互排,然后一路向上,直到上面比你大为止。然后每个元素执行相同的操作。
最好时间复杂度O(n),最坏时间复杂度O(n2)(我比较完你比较),平均时间复杂度O(n2)。
空间复杂度O(1),原地排序算法,因为每次只涉及两个元素的交换操作。
是稳定排序算法,遇到相同不交换。
总结下,冒泡排序就是一个交换的算法。
插入排序
插队排序引入了一个方法,就是将数据集分为已排序区间和未排序区间。然后从未排序区间依次取元素差到已排序区间中。对于相同的元素,插到已经存在于已排序区间元素的后面。
插入排序涉及插入和移动。
最好的时间复杂度O(n),最坏的时间复杂度O(n2),平均时间复杂度O(n2)。
空间复杂度O(1),原地排序算法。
稳定排序算法,遇到不交换。
选择排序
选择排序其实是插入排序的另一个版本。同插入排序一样,也有已排序区间和未排序区间。但是从未排序区间的取数方式不是按次了,而是按最小值。对于相同的元素,插到已经存在于已排序区间元素的前面。
同插入排序一致,选择排序涉及插入和移动。
最好的时间复杂度是O(n2),最坏的时间复杂度O(n2),平均时间复杂度O(n2)。
空间复杂度O(1),原地排序算法。
不稳定排序算法。
补充
冒泡排序和插入排序的交换次数等于原数据的逆序度
插入排序的升级版本,希尔排序
参考
排序算法的稳定性及其意义:https://blog.csdn.net/u012501054/article/details/79342580