排序法 | 概念 | 最坏所需时间 | 平均所需时间 | 稳定性 | 所需的额外空间 |
---|---|---|---|---|---|
直接查插入排序 | 将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | ✓ \checkmark ✓ | O ( 1 ) O(1) O(1) |
希尔排序 (又称缩小增量排序) | 先将整个待排序记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序时",再对全体记录进行一次直接插入排序. | O ( n 2 ) O(n^2) O(n2) | O ( n 1.3 ) O(n^{1.3}) O(n1.3) | × \times × | O ( 1 ) O(1) O(1) |
冒泡排序 | 冒泡排序也称沉底法,每相邻两个记录关键字比较大小,大的记录往下沉(也可以小的记录往上浮).每一遍把最后一个下沉的位置记下,下一遍只需检查比较到此为止;到所有记录都不发生下沉时,整个过程结束(每交换一次,记录减少一个反序数). | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | ✓ \checkmark ✓ | O ( 1 ) O(1) O(1) |
快速排序 | 任取待排序序列中的某个元素作为基准,通过一趟快速排序将待排序的元素分割成左右两个子序列,其中左子序列的排序关键字均比基准值(也称枢轴)元素的关键字值小;右子序列元素的关键字均比基准元素的关键字大,基准元素得到了它在整个序列中的最终位置并被存放好,这个过程称为一趟快速排序.第二趟再分别对分割成左右两部分的子序列进行快速排序,这两部分子序列中的枢轴元素也得到了最终在序列中的位置而被存放好,并且它们又分别分割出左右独立的里昂个子序列 ⋯ \cdots ⋯ | O ( n 2 ) O(n^2) O(n2) | O ( n log 2 n ) O(n\log_{2}{n}) O(nlog2n) | × \times × | O ( log 2 n ) O(\log_{2}{n}) O(log2n) |
简单选择排序 | 初始状态:整个数组r划分成两个部分,即有序区(初始为空)和无序区. 基本操作:从无序区中选择关键字值最小的记录,将其与无序区的第一个记录交换位置(实质是添加到有序区尾部). 从初态(有序区为空)开始,重复步骤2,直到终态(无序区为空). | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | ✓ \checkmark ✓ | O ( 1 ) O(1) O(1) |
堆排序 | 是利用堆树来进行排序的方法.堆树是一种特殊的完全二叉树,如果该完全二叉树中每一个节点的值均大于或等于它的两个子节点的值,则称为大顶堆(或大根堆);如果该完全二叉树中每一个结点的值均小于或等于它的两个子节点的值,则称其为小顶堆(或小根堆). 基本思想:(1)建堆:把用数组存储的n个待排序数据,看作成一颗完全二叉树的顺序存储形式,并对这颗完全二叉树进行一系列的比较交换,将其建成一颗堆树. (2)交换:将堆顶数据和当前待排序序列的最后那个数据相交换,堆顶数据即可排到其最终位置,待排序数据从而减少一个. (3)调整:由于最后那个数据交换到堆顶,它破坏了原有的堆结构,应将其不断向下交换,直到剩余的待排序数据重新调整成一颗堆树. (4)不断重复(2)(3)两步,直到待排序数据只剩一个为止,此时所有数据即已排成有序. | O ( n log 2 n ) O(n\log_{2}{n}) O(nlog2n) | O ( n log 2 n ) O(n\log_{2}{n}) O(nlog2n) | × \times × | O ( 1 ) O(1) O(1) |
归并排序 | (1)将n个记录的待排序序列看成是由n个子长度都为1的有序子表组成. (2)将两两相邻的子表归并为一个有序子表. (3)重复上述步骤,直至归并为一个长度为n的有序表. | O ( n log 2 n ) O(n\log_{2}{n}) O(nlog2n) | O ( n log 2 n ) O(n\log_{2}{n}) O(nlog2n) | ✓ \checkmark ✓ | O ( n ) O(n) O(n) |
[数据结构]常用排序算法的比较
最新推荐文章于 2021-04-05 22:08:56 发布