排序算法宋词记忆法
排序:将无序的数据排列成有序数据
常见排序算法
编号 | 中文名称 | 英文名称 | 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|---|---|
1 | 选择排序 | Selection | n^2 | n^2 | n^2 | 1 | 不稳 |
2 | 冒泡排序 | Bubble | n^2 | n^2 | n | 1 | 稳 |
3 * | 插入排序 | Insertion | n^2 | n^2 | n | 1 | 稳 |
4 * | 堆排序 | heap | n * log2(n) | n * log2(n) | n * log2(n) | 1 | 不稳 |
5 | 希尔排序 | Shell | n^1.3 | n^2 | n | 1 | 不稳 |
6 * | 归并排序 | Merge | n * log2(n) | n * log2(n) | n * log2(n) | n | 稳 |
7 * | 快速排序 | Quick | n * log2(n) | n^2 | n * log2(n) | log2(n) | 不稳 |
8 | 桶排序 | Bucket | n + k | n^2 | n | n + k | 稳 |
9 | 计数排序 | Counting | n + k | n + k | n + k | n + k | 稳 |
10 | 基数排序 | Radix | n * k | n * k | n * k | n + k | 稳 |
其中打 * 的是最重要的4种排序算法,需要记住它们的
一般不用记最坏和最好时间复杂度,只需要记住平均时间复杂度即可
马某的宋词记忆法:
《忆秦娥 娄山关》毛泽东
西风烈,
长空雁叫霜城月,
雄关漫道真如铁,
而今迈步从头越。。。
马某:《忆排序 我最强》
选泡插, -- 选择、冒泡、插入(选一跟儿大炮,插ta一下 -_-)
快归堆希统计基, --快速、归并、堆排序、希尔、桶排序、计数、基数(做统计的基友,快归西了,就入土堆)
恩方恩老恩一三, --“恩方”是“选泡插”的时间复杂度,谐音n的平方,“恩老恩”是“快归堆”的n*log2(n),“恩一三”是“希尔”的n^1.3
对恩加K恩乘K, --剩余的“统计基”中,“对”表示前面的一对,即“统计(桶、计数)”的时间复杂度是n+k,最后一个就是n*k
不稳稳稳不稳稳, -- “选泡插”的稳定性是不稳、稳、稳,“不稳稳”表示“快归”的稳定性
不稳不稳稳稳稳! -- “不稳不稳”是紧接着的“堆希”,其余全是稳定的“统计基”
时间复杂度函数对比图:
附上绘制时间复杂度函数对比的python代码:
# encoding: utf-8
import numpy as np
import pylab as pl
import matplotlib.font_manager as fm
import matplotlib
n = np.arange(0,1000,1) # “数据量大小”的数组:从0到1000,按1递增
pl.plot(n, n ** 2, label='$n^2$')
pl.plot(n, n * np.log2(n), label='$n * log2(n)$')
pl.plot(n, n ** 1.3, label='$n^{1.3}$')
pl.plot(n, n, label='$n$')
# pl.plot(n, n+k, label='$n$')
pl.xlim(0,1000) # 限定x轴的数值范围
pl.ylim(0,1000)
pl.legend(loc='best') # 图例摆放位置,可选值: best right center left lower upper
pl.xlabel(u'数据量大小')
pl.ylabel(u'时间复杂度')
pl.title(u'各种时间复杂度函数对比',size=18)
pl.show()
# ref: https://www.runoob.com/w3cnote/matplotlib-tutorial.html