python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...

这篇博客探讨了Python中的递归和分治算法,通过电影院票价问题展示了线性时间选择问题的解决方法,对比了直接遍历和快速排序的效率。此外,还讨论了大数乘法问题,分析了Python内置大数乘法的高效性,并提供了一个分治算法的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python实现递归和分治

一、开发环境

开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序

编程语言:python3.6

二、实验目标

1. 熟悉递归和分治算法实现的基本方法和步骤;

2. 学会分治算法的实现方法和分析方法:

三、实验内容

问题1,线性时间选择问题:

1) 在 4 59 7 23 61 55 46中找出最大值,第二大值,和第四大的值(要求不允许采用排序算法),并与第一章实现的快速排序算法进行比较。

2) 随机生成10000个数,要求找出其中第4999小的数,并与第一章实现的快速排序算法进行比较。

将4 59 7 23 61 55 46作为列表输入函数中,并且返回输出的结果

方法:直接遍历找到最大值,然后删除,再遍历,依次找到第2,3,4大的数据并且返回

每次都需要遍历一遍列表中所有的元素

快速排序的方法:将列表使用快速排序进行从大到小的排列,复杂度O(nlogn)然后直接返回对应的数,复杂度O(1),快速排序代码来自上一节。

代码如下所示:

# 直接遍历找到最大值,然后删除,再遍历,依次找到第2,3,4大的数据并且返回

def find_1_2_4(lis):

find1=lis[0];find2=lis[0];find3=lis[0];

for i in range(len(lis)):

if find1

find1 = lis[i]

lis.remove(find1)

for i in range(len(lis)):

if find2

find2=lis[i]

lis.remove(find2)

for i in range(len(lis)):

if find3

find3=lis[i]

lis.remove(find3)

find3=lis[0]

for i in range(len(lis)):

if find3

find3=lis[i]

lis.remove(find3)

return find1, find2, find3

# 快速排序,划分操作, 快速排序的辅助函数

def split(lis, first, last):

pivot = lis[first]

left = first

right = last

while left

while pivot < lis[right]:

right=right-1

while left < right and (lis[left] < pivot or lis[left] == pivot):

left=left+1

if left < right:

lis[left], lis[right] = lis[right], lis[left]

# 确定好基准位置

pos = right

lis[first] = lis[pos]

lis[pos] = pivot

return pos

# 快速排序实现

def quicksort(lis, first, last):

if first < last:

pos = split(lis, first, last)

quicksort(lis, first, pos-1)

quicksort(lis, pos

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值