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