排序:重新排列序列,使之按关键字递增或递减。
对n个元素进行排序的时间复杂度最快也要O(n)/*初始有序*/、通常是O(nlogn)或O(n^2).
根据排序过程中,数据元素是否完全在内存中,将排序算法分为两类;内部排序和外部排序。
一般情况下,内部排序算法在执行过程中都要进行两种操作:比较和移动;
比较两关键字,确定对应元素的前后关系,然后通过移动元素以达到有序。除基数排序/*基数排序不是基于比较的算法*/
时间复杂性(比较、移动) | 空间复杂性 | 稳定性 | 适用性 | 归位性 | |
直接插入排序 /*n个元素共需n-1趟*/ | O(n)~O(n^2)、O(n^2) /*最好情况:已经有序,只需比较一次*/ /*比较、移动的次数与初态有关*/ | O(1) | √ | 顺序表、链表 | 局部 |
折半插入排序 /*n个元素共需n-1趟*/ | O(nlogn)~O(n^2)、O(n^2) /*数据量较小的排序表,往往能表现出很好的性能*/ /*比较次数与初态无关,移动次数有关*/ | O(1) | √ | 顺序表 | 局部 |
希尔排序 | 约O(n^1.3)~O(n^2) | O(1) | × | 顺序表 | 局部 |
冒泡排序 /*n-1趟*/ | O(n)~O(n^2)、O(n^2) /*排序趟数与序列的原始状态有关*/ /*最少可以只有一趟,当且仅当完全有序时*/ | O(1) | √ | 顺序表、链表 | 全局 /*最大或最小值*/ |
快速排序 /*n-1次递归、划分*/ | O(nlog2n)~O(n^2)、O(nlogn) | O(nlogn) ~O(n) | × | 顺序表 | 全局 /*枢纽值*/ |
简单选择排序 /*n-1趟*/ | 始终是O(n^2) /*比较次数与初态无关*/ /*移动不会超过3(n-1)次,最好情况移动0次*/ | O(1) | × | 顺序表、链表 | 全局 |
堆排序 /*建堆、插入、调整 n-1趟交换建堆 */ | 始终是O(nlogn) | O(1) | × | 顺序表 | 全局 |
2路-归并排序 /*⌈logn⌉趟*/ | O(nlogn) | O(n) | √ | 顺序表 | 局部 |