目录
排序算法总结
1. 直接插入排序
- 思想:将待排序元素插入到已排序序列的合适位置。
- 步骤:
- 初始时,第1个元素视为有序序列。
- 从第2个元素开始,依次与前面的元素比较,找到合适位置插入。
- 特点:
- 时间复杂度:O(n²)(最好情况O(n),已有序)。
- 空间复杂度:O(1)(原地排序)。
- 稳定排序。
- 适用场景:
- 数据量小或基本有序时效率较高。
2. 希尔排序(缩小增量排序)
- 思想:分组插入排序,逐步缩小增量,最终进行全序列插入排序。
- 步骤:
- 选择增量序列(如5, 3, 1)。
- 对每个增量分组进行插入排序。
- 特点:
- 时间复杂度:O(n^(1.3~2))(取决于增量序列)。
- 空间复杂度:O(1)。
- 不稳定排序。
- 适用场景:
- 适用于大数据量,比直接插入排序更高效。
3. 简单选择排序
- 思想:每次从未排序部分选出最小元素,放到已排序序列末尾。
- 步骤:
- 遍历数组,找到最小值并与第1个元素交换。
- 重复上述过程,每次减少一个未排序元素。
- 特点:
- 时间复杂度:O(n²)(无论是否有序)。
- 空间复杂度:O(1)。
- 不稳定排序(交换可能破坏顺序)。
- 适用场景:
- 数据量小,交换次数较少。
4. 堆排序
- 思想:利用堆结构(大根堆/小根堆)进行排序。
- 步骤:
- 建堆:从最后一个非叶子节点调整,形成堆。
- 每次取堆顶元素(最大值),与末尾元素交换,调整剩余堆。
- 特点:
- 时间复杂度:O(nlogn)(建堆O(n),调整O(logn))。
- 空间复杂度:O(1)。
- 不稳定排序。
- 适用场景:
- 适合大数据量,尤其需要前几名元素时。
5. 冒泡排序
- 思想:相邻元素比较交换,每一轮将最大元素“冒泡”到末尾。
- 步骤:
- 从前往后比较相邻元素,逆序则交换。
- 每轮减少一个未排序元素。
- 特点:
- 时间复杂度:O(n²)(最好情况O(n),已有序)。
- 空间复杂度:O(1)。
- 稳定排序。
- 适用场景:
- 数据量小或基本有序时。
6. 快速排序
- 思想:分治法,选取基准元素,将序列分为左右两部分。
- 步骤:
- 选择基准(如第一个元素)。
- 从右向左找小于基准的元素,从左向右找大于基准的元素,交换。
- 递归处理左右子序列。
- 特点:
- 时间复杂度:平均O(nlogn),最坏O(n²)(已有序时)。
- 空间复杂度:O(logn)(递归栈)。
- 不稳定排序。
- 适用场景:
- 大数据量,平均性能最优。
7. 归并排序
- 思想:分治法,将序列分成子序列排序后合并。
- 步骤:
- 递归分解序列至单个元素。
- 合并两个有序子序列。
- 特点:
- 时间复杂度:O(nlogn)。
- 空间复杂度:O(n)(需额外存储空间)。
- 稳定排序。
- 适用场景:
- 大数据量,需稳定排序时。
8. 基数排序
- 思想:按关键字(如个位、十位)分桶排序。
- 步骤:
- 从低位到高位依次排序。
- 每次排序后重新分桶。
- 特点:
- 时间复杂度:O(d(n+r))(d为关键字位数,r为基数)。
- 空间复杂度:O(n+r)。
- 稳定排序。
- 适用场景:
- 关键字位数少且数据量大时(如整数排序)。
排序算法对比
排序方法 | 时间复杂度(平均) | 空间复杂度 | 稳定性 | 适用场景 |
---|---|---|---|---|
直接插入排序 | O(n²) | O(1) | 稳定 | 小数据量或基本有序 |
希尔排序 | O(n^(1.3~2)) | O(1) | 不稳定 | 大数据量 |
简单选择排序 | O(n²) | O(1) | 不稳定 | 数据量小,交换少 |
堆排序 | O(nlogn) | O(1) | 不稳定 | 大数据量,找前几名 |
冒泡排序 | O(n²) | O(1) | 稳定 | 小数据量或教学示例 |
快速排序 | O(nlogn) | O(logn) | 不稳定 | 大数据量,平均性能最优 |
归并排序 | O(nlogn) | O(n) | 稳定 | 大数据量,需稳定排序 |
基数排序 | O(d(n+r)) | O(n+r) | 稳定 | 关键字位数少且数据量大 |
真题示例:
将数组{1,1,2,4,7,5}从小到大排序,若采用________排序算法,则元素之间需要进行的比较次数最少,共需要进行________次元素之间的比较。
A. 直接插入 B. 归并 C. 堆 D. 快速
A. 5 B. 6 C. 7 D. 8
直接插入 | 归并 | 堆 | 快速 | |
比较次数 | 6 | 9 | 9 | 15 |
在n个数的数组中确定其第i(1<=i<=n)小的数时,可以采用快速排序算法中的划分思想,对n个元素划分,先确定第k小的数,根据i和k的大小关系,进一步处理,最终得到第i小的数。划分过程中,最佳的基准元素选择的方法是选择待划分数组的( )元素。此时,算法在最坏情况下的时间复杂度为(不考虑所有元素均相等的情况)( )。
A.第一个 B.最后一个 C.中位数 D.随机一个
A.Θ(n) B.Θ(lgn) C.Θ(nlgn) D.Θ(n²)
- 基准选择方法:
- 选择中位数理论上最优。
- 时间复杂度:
- 最坏情况(如每次选到最差基准)为 Θ(n²)。
对N个数排序,最坏情况下时间复杂度最低的算法是( )排序算法
A、插入 B、冒泡 C、归并 D、快速
排序算法 | 最坏时间复杂度 |
---|---|
插入排序 | O(n²) |
冒泡排序 | O(n²) |
归并排序 | O(nlogn) |
快速排序 | O(n²) |