对于各类排序算法的思想和复杂度的理解其实并不难,但是要做到记忆和灵活应用,对于一些关键问题的记忆是很基础的一部分。主要将自己的记忆思路写下来,方便你我他~~
本文分为两部分,一部分是帮助记忆的,一部分是帮助理解的
第一部分:记忆
首先,排序分类:
一、简单排序:
冒泡、直接选择、直接插入
冒泡 | 直接选择 | 直接插入 | |
平均复杂度 | O(n²) | O(n²) | O(n²) |
最好情况 | O(n) | O(n²) | O(n) |
最坏情况 | O(n²) | O(n²) | O(n²) |
稳定性 | 稳定 | 不稳定【可能交换多次】 | 稳定 |
辅助空间 | O(1) | O(1) | O(1) |
代码实现 |
两层for循环 | 两层for循环
| 两层for循环 外层【0,length)i++ 待插入元素 内层【i-1,0】j-- 从后往前比较 若比自己大 将其后移,否则break 交换 |
二、按方式
插入排序:直接插入、shell排序【缩小增量排序】
选择排序:直接选择、堆排序
交换排序:冒泡、快速排序
归并排序
基数排序
1、不稳定:选择排序(直接选择排序、堆排序),希尔排序、快速排序【希快、堆直选】
稳定:直接插入、冒泡、归并、基数
2、平均/最好/最坏复杂度都一样的:
选择排序:
直接选择:O(n²)
堆排序:O(nlog₂n)
归并:O(nlog₂n)
3、不一样的(平均/最好/最坏)复杂度
插入排序:
直接插入:O(n²) O(n)O(n²)
希尔排序:O(n1.3) O(n)O(n²)
交换排序:
冒泡排序:O(n²) O(n)O(n²)
快速排序:O(nlog₂n)O(nlog₂n)O(n²)
基数排序:O(d(r+n)) O(d(n+rd))O(d(r+n))
第二部分:理解
此处粘贴好文,这个博客讲的非常详细。