3 搜索|排序&复杂度分析(2)

基本排序算法

每个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

使用相同参数重复调用的递归函数,可以通过记忆来使其更有效率                                                                                                                                                       将其转化为一个线性算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值