算法的稳定性:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
常见的排序算法:
1.插入排序:
直接插入排序
希尔排序
2.选择排序:
选择排序
堆排序
3.交换排序:
冒泡排序
快速排序
4.归并排序
复杂度及其稳定性:
1.插入类排序
代码实现:
https://blog.csdn.net/weixin_43519514/article/details/104770087
直接插入排序
基本思想是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
时间复杂度O(N^2)
空间复杂度O(1)
稳定性:稳定
效率:待排序列越接近于有序,时间效率越高
希尔排序:
基本思想:
(预排序) 先选定一个整数n(间距即代码中的gap),将待排序列分成n组,所有距离为n的在同一个组,并对每一组内的记录进行排序。然后,重新取n的值,
(插入排序) 重复上面的步骤,直到n=1时所有记录在同一组内排成有序序列。
时间复杂度: O(N^1.3-N ^2)
空间复杂度:O(1)
稳定性:不稳定
在预排序的时候,相同的元素可能分到不同的组中,因此,我们无法控制相同元素的相对位置保持不变
2.选择排序:
选择排序
基本思想:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的 数据元素排完 。
时间复杂度O(N^2)
空间复杂度O(1)
稳定性:不稳定
堆排序
基本思想:
时间复杂度O(N*logN)
空间复杂度O(1)
稳定性:不稳定
3.交换排序:
冒泡排序
时间复杂度O(N^2)
空间复杂度O(1)
稳定性:稳定
快速排序
时间复杂度O(N*logN)
空间复杂度O(logN)
稳定性:不稳定
4.归并排序
时间复杂度O(N*logN)
空间复杂度O(N)
稳定性:稳定