问题描述:
(必做)给定一个乱序数字列表,编写一个算法复杂度是 O(nlogn)的算法,找出第k小的元素;
(选做)针对该问题,能将算法的时间复杂度优化到线性阶?请说明思路!
要求:(1)编写程序,能够打印数字列表和第k小的元素,给出程序以及输出截图
(2)算法复杂度可以借助画图/表格/文字等形式表现,必须要有自己的分析
我的答案:
查询了一些排序算法的比较,具体可以参考这篇,写得很详细。各种排序算法复杂度比较_zhc_24的博客-CSDN博客_排序算法复杂度
最后选择研究归并排序,先分割再集成,将所有数据用递归的方式排成递归树,每层最多进行n次比较,一共最多logn层,时间复杂度为O(nlogn)。
def merge(arr, l, m, r):
n1 = m - l + 1
n2 = r - m
L = [0] * (n1) # 临时数组L和R
R = [0] * (n2)
for i in range(0, n1): # 拷贝数据
L[i] = arr[l + i]
for j in range(0, n2):
R[j] = arr[m + 1