1. 归并排序,时间复杂度是O(NlogN)
基本思想是将已经排序好的子序列做排序,归并为一个有序的大序列。(分治算法)。
2. 排序的稳定性:
一般说,如果排序过程中,只有相邻元素进行比较,是稳定的,如冒泡排序、归并排序(可以算作相邻元素比较);如果间隔元素进行比较,往往是非稳定的,如堆排序、快速排序。直接插入排序是稳定的;但是二分插入排序本身不稳定,如果要稳定,需要向后探测。对于不稳定排序可以使用(A[i],i)键对来进行算法,使得不稳定排序变为稳定排序。
3. 桶排序/基数排序
将元素分到若干个桶中,每个桶分别排序,然后归并
4. 计数排序,时间复杂度为O(N)。空间复杂度为O(N+K)
用空间换时间,本质是建立基于元素的hash表
建立一个辅助空间,记录每个原始数据出现的次数,然后转换成前N项和数组。从后往前遍历原始数组到存放排序结果的新数组中。
5. 排序分类:内排序/外排序
常见排序方法:
插入排序/希尔排序
选择排序/锦标赛排序/堆排序
冒泡排序/快速排序
归并排序
基数排序
6. 堆排序
最大、最小堆只是要求父子结点满足比较关系。
先写一个递归函数维护堆,能够处理的情况是有一个堆结点不满足最大堆(或最小堆)的性质。然后写一个创建堆函数,利用维护堆函数,从堆的最后结点的二分之一那个结点开始到结点1调用维护堆函数进行建堆,然后把堆的第一个结点和最后一个结点交换,取出排序好的序列,实现堆排序。(把堆的顶元素放在下标为1的数组元素中方便写程序)。
堆排序的时间复杂度是O(NlogN),
7. 快速排序是O(NlogN),
采用分治算法,选择一个值作为Key
--------------------------------
排序算法的不稳定性:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。