没有合适的资源?快使用搜索试试~ 我知道了~
首页python 实现在无序数组中找到中位数方法
资源详情
资源评论
资源推荐

python 实现在无序数组中找到中位数方法实现在无序数组中找到中位数方法
主要介绍了python 实现在无序数组中找到中位数方法,具有很好对参考价值,希望对大家有所帮助。一起跟随
小编过来看看吧
一、问题描述一、问题描述
1、、求一个无序数组的中位数, (若数组是偶数,则中位数是指中间两个数字之和除以2,若数组是奇数,则中位数是指最中
间位置。要求:不能使用排序,时间复杂度尽量低
2、、例如:
lists = [3, 2, 1, 4] , 中位数为 = (2+3)/2 = 2.5
lists = [3, 1, 2] , 中位数为 2
3、算法思想:、算法思想:
利用快速排序思想(但是并不是全部使用):任意挑选一个元素,以该元素为key, 划分数组为两个部分,如果左侧数组长度
刚好为(n-1)/2, 那么key就为中位数, 若左侧数组长度 < (n-1)/2 , 那么中位数点在右侧,反之,中位数在左侧。然后进入相应
的一侧继续寻找中位
平均时间复杂度为O(n)
二、程序二、程序
class Solution(object):
def findmedian(self, lists):
if not lists or len(lists) == 0:
return []
n = len(lists)
if n % 2 == 0:
a = self.partition(lists, n/2, 0, n-1)
b = self.partition(lists, n/2-1, 0, n-1)
mid = (lists[a]+lists[b])/ (2 * 1.0)
return mid
else:
mid = self.partition(lists, n/2, 0, n-1)
return lists[mid]
def partition(self, lists, k, start, end):
key = lists[start]
left, right = start, end
while left < right:
while left < right and lists[right] > key:
right = right - 1
lists[left] = lists[right]
while left < right and lists[left] < key:
left = left + 1
lists[right] = lists[left]
lists[left] = key
if left == k:
return left
elif left > k:
return self.partition(lists, k, start, left-1)
else:
return self.partition(lists, k, left+1, end)
if __name__ == "__main__":
sol = Solution()
lists = [2, 5, 4, 9, 3, 6, 8, 7, 1]
# lists = [1, 2]
data = sol.findmedian(lists)
print("中位数 = %s" % data)
知识补充:知识补充:python streaming 实现某个字段排序实现某个字段排序















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0