先来个表格总结直观展示下:

<caption> 各种内部排序算法的性质 </caption>
           算法种类                    时间复杂度  空间复 杂度 稳定性
最好情况 平均情况 最坏情况
插入排序 直接插入排序 O(n) O(n^2) O(n^2) O(1) 稳定
折半插入排序 O(n) O(n^2) O(n^2) O(1) 稳定
希尔排序 O(n^1.3) O(nlogn) O(n^2) O(1) 不稳定
交换排序 冒泡排序 O(n) O(n^2) O(n^2) O(1) 稳定
快速排序 O(nlogn) O(nlogn) O(n^2) O(logn) 不稳定
选择排序 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
归并排序 二路归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定
              基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)) O(r) 稳定

 

下面详细说明一下:

 1.时间复杂度:(不包括基数排序)

平均情况下,快速排序、希尔排序(和增量有关,n在特定范围内为O(n^1.3))、归并排序、堆排序时间复杂度为O(nlogn),其他均为O(n^2);

最坏情况下,快速排序、希尔排序为O(n^2),其他均和平均情况下相同;

最好情况下,直接插入排序、折半插入排序、冒泡排序时间复杂度为O(n)(初始序列有序)。

2.空间复杂度:

快速排序O(logn),2路归并排序O(n),基数排序O(r),其他都是O(1)。

3.稳定性:

希尔排序、快速排序、简单选择排序、堆排序不稳定,其他都是稳定的。

4.其他:

经过一趟排序,能保证一个元素到达最终位置:交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、堆排序)。

5.例题:

若输入数据存储在带头结点的双向循环链表中,下面排序算法是否仍然适用?

  • 快速排序:适用。因为可以快速定位到第一个元素和最后一个元素结点,然后通过1个指针从头部向后移动,另外一个指针从尾部向前移动,逐一与基准元素进行比较,并能够通过修改指针完成结点交换操作。
  • 直接插入排序:适用。因为可以方便地找到前驱后继和通过修改指针完成结点交换操作。
  • 简单选择排序:适用。因为只需要移动指针遍历链表并通过修改指针完成结点交换。
  • 堆排序:不适用。因为双向循环链表无法很方便地找到完全二叉树的双亲与孩子结点。