排序总结
1.插入排序
- 直接插入排序。其基本操作是将一条记录,插入到已经排好序的有序表中,从而得到一个记录数+1的有序表。时间复杂度为n平方,空间复杂度为1.是稳定的排序。
- 折半插入排序。其基本操作也是将记录插入到已经排好序的列表中,但是插入位置的查找过程采用折半查找来实现。时间复杂度为n平方,空间复杂度为1。是稳定的排序。
- 希尔排序。又称为缩小增量排序。因为插入排序的特点是列表基本有序的时候效率较高。先取元素相隔d1的元素为一组,每组都进行插入排序。再去元素相隔d2(d2<d1)为一组,进行插入排序。直到选取的增量为1时,排序结束。希尔排序的时间复杂度涉及到增量序列,这涉及到一些尚未解决的数学难题,有人指出n的3/2次方。空间复杂度是1.是不稳定的排序算法。
2.交换排序
- 冒泡排序。两两比较,如果出现逆序,则进行交换,从而小的关键字会往上浮。如果排序过程中没有出现交换,则停止。时间复杂度n平方,空间复杂度1.是稳定的排序。
- 快速排序。选从记录中选择1个记录作为中枢节点,然后将所有大于中枢节点的值放到右边,小于中枢节点的放到左边。完成后,对左右两边的记录进行相同的操作。直到左右都只有一个记录时完成。平均时间复杂度为nlogn。当为排好序的序列进行快排时,最坏达到n的平方。快排采用递归,空间复杂度最好为logn,最坏为n。是不稳定的排序。
3.选择排序
- 简单选择排序。每趟选择最小的值放到列表后面。直到全部选完。时间复杂度为n平方,空间复杂度为1.是稳定的排序。
- 树形选择排序。构建满二叉树,所有待排序列在叶子节点,节点之间两两比较,较小的节点上升为父节点,再进行父节点层的比较,直到最后选出最小节点。将原先的最小叶子节点设置为无穷大再进行相同的操作,直到将所有数的取出,则完成排序。时间复杂度为nlogn,空间复杂度较大2n。
- 堆排序。由所有记录构建完全二叉树,首先选择非叶子节点,与其叶子节点进行比较,如果比叶子节点小,就和叶子节点交换。再往上层的非叶子节点进行相同的操作,直到构建大顶堆。此时堆顶即为最大值,将它与最后一个叶子节点交换,再对当前的根节点与其子节点比较,再次调整为大顶堆。进行与第一个大顶堆点相同的操作。时间复杂度nlogn,空间复杂度为1.是不稳定排序。
4.归并排序。是将两个或两个以上有序表合并成一个有序表的算法。首先将n个记录看成是n个长度为1的有序表,将它们两两合并。再将合并后的有序表两两合并。时间复杂度为nlogn。用顺序表进行归并排序时,需要临时数组做辅助空间,空间复杂度为n。是稳定排序。
5.链式基数排序。每个记录有多个关键字,按关键字的取值范围划分成多个队列,先遍历记录,按每个记录的关键字将记录添加到不同的队列中。分配完成后,收集每个队列的记录,再按每个记录的第二个关键字分配。直到记录的所有关键字都被用于分配。时间复杂度是d(n+k),其中d为元素的关键字个数,n为记录个数,k为每一趟收集的时间复杂度。空间复杂度为n。是稳定的排序。