Python算法——分治法查找数组中元素最小最大值
要求:
给定数组a1,a2,a3,...an,找出数组中最大值和最小值。(数组中两两各不相同)
分析:
算法思想类似于上图,将数组两两分为一组,如果数组元素奇数个,就把最后一个元素单独分为一组,然后分别对每一组中相邻两个元素比较,把二者中值小的数放在数组左边,值大的数放在数组右边,只需比较n/2次就可以将数组分组完成。这时候最小值在每一组左边部分,最大值在每一组右边部分,接着在每一组左边部分找最小值,右边部分找最大值,查找分别需比较n/2-1次和 n/2-1次。因此,总共比较次数约为(n/2)+(n/2-1)+(n/2-1)=3n/2-2次。
实现代码:
# -*- coding:utf-8 -*-
class MaxMin():def __init__(self):self.max = Noneself.min = Nonedef getMax(self):return self.maxdef getMin(self):return self.mindef GetmaxAndmin(self,arr):if arr==None:print("参数不合法")returni = 0lens = len(arr)self.max = arr[0]self.min = arr[0]#两两分组,把较小放到左半部分,较大放到右半部分i = 0while i < (lens-1): #lens-1,否则会下标越界if arr[i]>arr[i+1]:tmp = arr[i]arr[i] = arr[i+1]arr[i+1] = tmpi += 2#在各个分组左半部分找最小值self.min = arr[0]i = 2while i < lens:if arr[i] < self.min:self.min = arr[i]i += 2#在各个分组右半部分找最大值self.max = arr[1]i = 3while i < lens:if arr[i] > self.max:self.max = arr[i]i += 2#如果数组元素个数是奇数,最后一个元素被分为一组,需特殊处理if lens % 2 == 1:if self.max < arr[lens-1]:self.max = arr[lens-1]if self.min > arr[lens-1]:self.min = arr[lens-1]if __name__ == "__main__":array = [7,3,19,40,4,7,1]m = MaxMin()m.GetmaxAndmin(array)print("max="+str(m.getMax()))print("min="+str(m.getMin()))
运行结果:
max=40
min=1
性能分析:
无论是最好、最坏或者平均情况,该MaxMin分治算法所用的比较次数都是3n/2-2。 而实际中,任何一种以元素比较为基础的找最大值最小值元素的算法,其元素比较次数的下界为3n/2-2。 因此,从此种情况上分析,该算法是最优的。
Python算法——分治法查找数组中元素最小最大值相关推荐
- 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)
代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g 提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...
- [python] 分治法查找数组元素的最大值和最小值
分治法查找数组元素的最大值和最小值 分治法简介: 分治法从字面上的解释是"分而治之",就是把一个复杂的问题分成两个或者更多相同或者相似的子问题,再把子问题分成更小的子问题,直到最后 ...
- Java实现利用分治法找到数组中的最大最小元素
Java实现利用分治法找到数组中的最大最小元素 基本思路: 不断的寻找数组的左子数组和右子数组,当左子数组和右子数组的长度为1时,最大最小元素均为本身,当左子数组和右子数组的长度为2时,直接进行一次比 ...
- (c语言)编程输出二维数组中元素的最大值,要求用指针实现。
(c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...
- 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。
题目:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中,m和n的值由用户键盘输入.已知m和n的值都不超过10. void InputArray( ...
- C语言数组练习-计算数组中元素的最大值及其所在的行列下标值
要求:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中m和n的值由用户键盘输入.已知m和n的值都不超过10. ----------------- ...
- 分治法查找数组元素的最大值和最小值(python实现)
实验内容 给定任意几组数据,利用分治法的思想,找出数组中的最大值和最小值并输出 实验原理 利用分治法,将一个数组元素大于 2 的数组分成两个子数组,然后对每一个子数组递归调用,直到最小的子数组的元素个 ...
- 第k大的数python代码_Python实现查找数组中任意第k大的数字算法示例
本文实例讲述了Python实现查找数组中任意第k大的数字算法.分享给大家供大家参考,具体如下: 模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候, ...
- c语言在数组中找最小数,C语言 查找数组中最大最小元素
//findMax.c /** 查找数组中最大,最小的元素. */ #include #include #include void main() { int array[10];// int Y=10 ...
最新文章
- Python局域网socket无法连接的问题解决
- Linux(五) 权限
- 小米笔记本充电实测追求速度牺牲兼容性小米笔记本充电驱动_是海尔?也是雷神?不足1千克MixBook Air超轻薄笔记本...
- django settings 定义的变量不存在_使用Django部署机器学习模型(1)
- Lenovo 媽媽咪啊,坑爹麼?(Win 7 整合 USB3 NVME )驅動
- MFC - CStdioFile 读取txt文件UNICODE 中文异常
- python系统下载-python
- 015.4守护线程和join
- arcgis重心迁移分析_ArcGIS支持下三峡库区适度人口重心迁移研究
- p6spy 简单使用
- iic总线的仲裁机制_iic总线
- 黑苹果安装经验整理|再见丁小果
- 生日提醒功能-提前三天
- siki学院的飞机大作战UE4.26代码
- 编写python程序实现分段函数_python分段函数如何编写?_后端开发
- 打造XP系统万能克隆-Ghost全攻略
- 深入剖析DHCP服务IP地址自动分配原理
- 各种十进制转十六进制的方法
- MAC Iterm 支持命令行翻译中英文
- 如何快速在线扫描文档?Web TWAIN SDK 教你轻松解决