Python 数据结构 3

搜索、排序和复杂度分析

算法是计算机程序的一个基本构建模块。
算法描述了最终能够解决一个问题的计算过程。
算法的评价标准:
正确性
可读性
可维护性
运行时间性能

复杂度评估

n:工作量与问题规模的增加成正比
n^2: 工作量与问题规模成2次方阶增长
logn: 工作量与问题规模成对数增长
k^n: 工作量与问题规模成指数增长
使用O(n)表示 O表示‘on the order of’

基本排序算法

选择排序

搜索整个列表,找出列表中的最小项,如果该最小项的位置不在第一位,则将其与第一位交换位置。依次类推,直到达到列表的最后一项。
在这里插入图片描述
获取列表长度;
遍历列表中的所有位置;
遍历所有需与i位置比较的位置;
如果j位置的数值比i位置大;
交换两位置对应的值;
遍历完后返回列表;
选择排序复杂度O(n^2)
最小复杂度
当列表为已经排好序的列表时,只需执行N次 即复杂度为O(n)
最大复杂度
当列表为倒序时,每个都需和后一个数交换位置,即需要(n-1)+(n-2)+…1 = 1/2n^2 +1/2n 只考虑主项,即N^2
所以选择排序的最大复杂度为nO(^2)

冒泡排序

冒泡排序是将列表中相邻的项两两进行比较,若相临两项顺序不对,则调换两项的顺序。
在这里插入图片描述
冒泡排序每执行一轮,会将该轮次所检索到的最大值置于最后,所以下一次检索只需要检索l-1次;
遍历列表中所有项;
将每一项与后一项比较;
若后一项比前一项小,交换对应的值;
返回处理过的列表;
选择排序复杂度O(n^2)
最小复杂度
当列表为已经排好序的列表时,只需遍历i执行N次 即复杂度为O(n)
最大复杂度
当列表为倒序时,每个前面位置的数需要N-i次交换交换到最后位置,即需要(n-1)+(n-2)+…1 = 1/2n^2 +1/2n 只考虑主项,即N^2
所以选择排序的最大复杂度为nO(^2)

插入排序

插入排序的思想是在第i次搜索时,将第i个元素插入到前i个值的合理位置上。
在这里插入图片描述
选取目标值;
将目标值下标前的值与该值做比较;
如果前值比目标值大,则将目标值往前移;
如果前值比目标值小,则结束;(因前i-1项是有序的)
遍历到最后一个值;
返回处理过的列表;
插入排序复杂度O(n^2)
最小复杂度
当列表为已经排好序的列表时,只需执行N次 即复杂度为O(n)
最大复杂度
当列表为倒序时,其i后的每个数都需和前面所有元素交换位置,即需要1+2+3+…+n-1 = 1/2n^2 +1/2n 只考虑主项,即N^2
所以选择排序的最大复杂度为nO(^2)

快速排序

在这里插入图片描述
由上述流程可知,每执行一次快速排序,会将本次作为基准点的值排序到正确的位置(因为分别遍历并将比它大的值放在右边,比它小的值放在左边),在多次递归后,每个最小单元中的元素都正确排序后,列表也就排序正确了
在这里插入图片描述
复杂度计算
最坏情况,当列表数值为倒序排列时,每一次分割分别获得n-i和i 两项, 需进行n-1次迭代分割,且每次都要执行比较的次数是1/2n^2 +1/2n,所有最坏情况下的复杂度是O(n^2)
一般情况下,当分割2^(n/2)次切割后,就能将元素拆分成单个元素,所有在最好情况下的性能为O(nlog2n)

归并排序

归并排序的思想是,将元素拆分成最小的序列,并对最小序列进行排序,再将有序的序列进行合并。返回排列好的列表。
在这里插入图片描述

在这里插入图片描述
先将列表从中间节点拆分成最小元素,然后构造新的列表按顺序插入到列表中,返回有顺序的列表
归并排序的时间复杂度是O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值