问题描述 【算法--分治法寻找中值】给定任意一个整数列,寻找这个整数列的中值。
解题思路 由于要用到分治算法,会递归求解,所以推广问题为:寻找一个整数列的第k大的数字。
思路1:将序列排序后再寻找第k大的数字,可以用到快速排序或归并排序。
思路2:使用快速排序的切分思想,将序列切为大于,等于,小于pivot的三个数组,分别叫L,M,R。如果k小于L的长度,那么在L里面递归;如果k大于L+M的长度,在R里面寻找第(k - len(L+M))大的数字。其余情况就是等于pivot,直接return就好。
def selection(arr,k):
print(arr)
if len(arr) == 1:#当只有一个元素,直接返回
return arr[0]
pivot = arr[0]#这步以后就是快速排序的切分
left, right = 1, len(arr)-1
while left != right:
while arr[right] >= pivot and left < right:
right -= 1
while arr[left] < pivot and left < right:
left += 1
if left < right:
arr[left], arr[right] = arr[right], arr[left]
arr[0], arr[left] = arr[left], arr[0]if k-1 > left:#k-1是因为索引从0开始
return selection(arr[left+1:],k-1-left)
elif k-1 < left:
return selection(arr[:left],k)
else:
return arr[k-1]array = [5,1,9,3,7,2,8,10,12,4,6,11]
ans = selection(array,10)
print(ans)
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络