Python数据结构测试题
1.使用Python实现冒泡排序,并分析时间复杂度
def bubble_sort(alist):
"""冒泡排序"""
count = 0 #用于降低最优时间复杂度
for j in range(1,len(alist)):
for i in range(len(alist)-j):
if alist[i]>alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
count += 1
if count == 0:
#发现原列表排序正确,不需排序
return
时间复杂度:
- 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
- 最坏时间复杂度:O(n^2)
2.使用Python实现选择排序,并分析时间复杂度
def select_sort(alist):
"""选择排序"""
for j in range(len(alist)-1):
min_index = j # 记录最小位置
for i in range(j+1,len(alist)):
if alist[min_index] > alist[i]:
min_index = i
alist[j],alist[min_index] = alist[min_index],alist[j]
时间复杂度
- 最优时间复杂度:O(n^2)
- 最坏时间复杂度:O(n^2)
3.使用Python实现快速排序,并分析时间复杂度
def quick_sort(alist, start, end):
"""快速排序"""
# 递归的退出条件
if start >= end:
return
# 设定起始元素为要寻找位置的基准元素
mid = alist[start]
# low为序列左边的由左向右移动的游标
low = start
# high为序列右边的由右向左移动的游标
high = end
while low < high:
# 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动
while low < high and alist[high] >= mid:
high -= 1
# 将high指向的元素放到low的位置上
alist[low] = alist[high]
# 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
while low < high and alist[low] < mid:
low += 1
# 将low指向的元素放到high的位置上
alist[high] = alist[low]
# 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
# 将基准元素放到该位置
alist[low] = mid
# 对基准元素左边的子序列进行快速排序
quick_sort(alist, start, low-1)
# 对基准元素右边的子序列进行快速排序
quick_sort(alist, low+1, end)
时间复杂度
- 最优时间复杂度:O(nlogn)
- 最坏时间复杂度:O(n^2)
4.使用Python实现二分查找,并分析时间复杂度
def binary_search2(alist, item):
"""二分查找递归版"""
n = len(alist)
if n>0:
mid = n//2
if alist[mid] == item:
return True
elif alist[mid] < item:
return binary_search2(alist[mid+1