基本排序算法
每个Python排序函数都是在整数的一个列表上进行操作的,并且都会使用一个swap函数交换列表中的两项的位置
选择排序O(n^2)
找到最小的项和第一位交换,以此类推
包含了一个嵌套的循环:外围循环共n-1次,每一次内部分别进行了n-1, n-2…1次循环,共n(n-1)/2次,即O(n^2)
对于较大的数据集合,交换各项的开销可能也很显著,但是数据交换只在外部循环中进行,所以可以看做线性的
冒泡排序O(n^2)
比较成对数据,直至末尾,将最大的项移至末尾
进行调整以令其最好情况提升到线性阶
如已排序,第一轮退出,则线性
插入排序O(n^2)
排列扑克牌顺序,在第i轮之后,前i个项是排好序的
审视前两位顺序,若不符则swap,至符合顺序规则,然后审视前三项大小,决定第三项位置,以此类推
外围循环n-1次,最坏情况,第一轮次迭代一次,第二轮次迭代两次。。。。依旧是O(n^2)
更快的排序O(nlogn)
“分而治之”:将列表分解为更小的列表(logn),随后这些子列表再递归地排序(n)
快速排序:
1 从列表中点位置选取一项(基准点)
2 列表中的项分区(不论基准点在哪里,这个位置都是完全排序列表中的最终位置)
3 分而治之。对于在基准点分割而形成的子列表,递归地重复应用该过程
4 每次遇到少于2个项的一个子列表,就结束这个过程
分割:
1 基准点和子列表最后一项交换
2 已知小于基准点的项和剩余的项之间建立一个边界
3 从子列表第一项开始扫描整个子列表。每遇到小于基准点的项就将其与边界后第一项交换,且边界向后移动
4 基准点和边界后第一项交换
最坏的情况:已经排好序了O(n^2)
快速排序使用递归算法更容易编码
合并排序(nlogn)
1 中间位置,左右子列表递归排序
2 将两个排好序的重新合并
3 当子列表不能划分时停止
指数算法(递归式的Finonacci)
使用相同参数重复调用的递归函数,可以通过记忆来使其更有效率 将其转化为一个线性算法