算法 | 是否稳定 | 是否为原地排序 | 时间复杂度 | 空间复杂度 | 备注 |
选择排序 | 否 | 是 | N2 | 1 | |
插入排序 | 是 | 是 | 介于N和N2 | 1 | 取决于输入元素的排列情况 |
希尔排序 | 否 | 是 | NlogN? N6/5 | 1 | |
快速排序 | 否 | 是 | NlogN | lgN | 运行效率由概率提供保证 |
归并排序 | 是 | 否 | NlogN | N | |
堆排序 | 否 | 是 | NlogN | 1 | |
三向快速排序 | 否 | 是 | 介于N和NlogN之间 | lgN | 运行效率由概率保证,同时取决于输入元素的分布情况 |
算法思想:将第i个记录插入到前面已经排好序的i - 1个记录中去。
算法要点:
算法时间复杂度:o(n^2)
算法思想:利用折半查找的思想找到需要插入的位置
算法时间复杂度:o(n^2),虽然减少了查找插入位置的次数,但是移动元素的时间仍未改变
算法思想:将待排序的关键字序列分成若干个较小的子序列,对子序列进行直接插入排序,使整个待排序序列排好序。
算法时间复杂度:o(n^1.5)
算法思想:从待排序记录中选择一个记录为枢纽,设为K,将其余大于K的记录移动至K的后面,小于K的移动至前面,此过程称为一趟快速排序。当然就是对接下来的两个字表进行相同的操作,直到子表的长度不超过1
算法时间复杂度:o(Knlog2n),K为常数因子,且在所有O(nlogn)复杂度中,快排的K值最小
算法思想:
第一趟:从第一个记录开始,通过n-1次关键字比较,从n个记录中选出最小的并和第一个记录交换;
第二趟:从第二个记录开始,通过n-2次关键字比较,从n -1个记录中选出最小的并和第二个记录交换;
...
算法时间复杂度:o(n^2)
算法思想:将向量中存储的数据看成一棵完全二叉树,利用完全二叉树中双亲节点和孩子节点之间的内在关系选择关键字最小的记录。
大根堆:各节点关键字满足:a[i] >= a[2i]并且a[i] >= a[2i + 1]
小根堆:各节点关键字满足:a[i] <= a[2i]并且a[i] <= a[2i+1]
算法时间复杂度:o(nlogn)
算法思想:设初始序列长度为n,将这n个序列看成n个有序的子序列,然后辆辆合并,得到一个ceil(n/2)长度为2的有序子序列。
在此基础上再对长度为2 的有序子序列进行归并排序,得到若干长度为4的子序列,如此重复直到得到一个长度为n的有序子序列为止
时间复杂度:o(nlogn)
选堆快希不稳(稳定性) 选堆归基不变(时间复杂度的变化特性)