貌似排序是在面试中经常出现的问题,那么我就来复习一下吧!
- 插入排序(insertion sort)
含义:第i趟排序将序列中第i+1个元素ki+1插入到一个已经按值有序的子序列(k'1, k'2, ..., k'i)的合适位置,得到一个长度为i+1,仍然有序的子序列(k''1, k''2, ..., k''i+1)。
优化:在寻找需要插入的位置时,可以采用折半查找对时间复杂度进行优化。
- 平均时间复杂度O(n2),采用折半查找则为O(nlogn);
- 稳定排序;
- 选择排序(selection sort)
含义:第i趟排序从序列的后n-i+1个元素中选择一个最小的元素与该n-i+1个元素最前的元素交换位置。
- 平均时间复杂度O(n2);
- 不稳定排序,例如(49, 38, 49', 13),一趟排序后会变成(13, 38, 49', 49),俩49交换了位置;
- 泡排序(bubble sort)
含义:比较相邻元素,若前者较大则交换两元素,一趟排序后最大值换到第n个位置。注意某一趟不发生元素交换时,排序完成。
- 平均时间复杂度O(n2),适用于元素基本有序的情况;
- 稳定排序;
- 谢尔排序(Shell's sort)
含义:又称缩小增量排序。先确定一个间隔gap,将参加排序的序列按此间隔一次分成若干子序列,对子序列排序,然后缩小间隔,直至gap = 1。
- 不适用于链表;
- 平均时间复杂度介于O(nlogn)和O(n2)之间,略大于O(nlogn);
- 不稳定排序;
- 快速排序(quick sort)
含义:被认为是对泡排序的一种改进,又称划分排序法。在当前参加排序的序列(ks, ks+1, ..., kt)中任选一个元素作为分界元素,将小于等于分界元素的所有元素都移到分界元素前面,把大于等于分界员素的所有元素移到分界元素后面,这样分界元素正好处于排序的最终位置,并把当前参加排序的序列划分成了前后两个子序列。
- 平均时间复杂度:O(nlogn);
- 不稳定排序;
- 堆排序(heap sort)
含义:是对选择排序的一种改进。建立初始堆,取堆顶元素,交换堆的第1个元素和最后1个元素,将前n-1个元素再转换为一个堆,重复取堆顶的过程。
堆的调整方法:当把第n个元素和堆顶交换后,剩余n-1个元素除堆顶外还维持堆的特性,因此将堆顶和左右孩子比较,与较大值交换,并继续与新的左右孩子比较并进行调整。
初始堆的建立:从最后一个非孩子节点开始进行堆的调整,直至堆顶。
- 不适用于链表;
- 时间复杂度:O(nlogn);
- 不稳定排序;
- 归并排序(merging sort)
含义:将两个按值有序的序列合并成一个。
- 平均时间复杂度:O(nlogn);
- 稳定排序;
- 桶排序(Bucket sort)
含义:将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
- 主要适用于均匀分布的数字数组;
- 最好情况下线性时间O(n);
- 稳定排序;
总结:
编号 | 算法 | 稳定性 | 最差时间复杂度 | 平均时间复杂度 | 空间复杂度 |
---|---|---|---|---|---|
1 | 插入排序 | 稳定 | O(n2) | O(n2) | O(1) |
2 | 选择排序 | 不稳定 | O(n2) | O(n2) | O(1) |
3 | 泡排序 | 稳定 | O(n2) | O(n2) | O(1) |
4 | 谢尔排序 | 不稳定 | O(n2) | O(nlogn)~O(n2) | O(1) |
5 | 快速排序 | 不稳定 | O(n2) | O(nlogn) | O(1) |
6 | 堆排序 | 不稳定 | O(nlogn) | O(nlogn) | O(1) |
7 | 归并排序 | 稳定 | O(nlogn) | O(nlogn) | O(n) |