要求:

给定数组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算法——分治法查找数组中元素最小最大值相关推荐

  1. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  2. [python] 分治法查找数组元素的最大值和最小值

    分治法查找数组元素的最大值和最小值 分治法简介: 分治法从字面上的解释是"分而治之",就是把一个复杂的问题分成两个或者更多相同或者相似的子问题,再把子问题分成更小的子问题,直到最后 ...

  3. Java实现利用分治法找到数组中的最大最小元素

    Java实现利用分治法找到数组中的最大最小元素 基本思路: 不断的寻找数组的左子数组和右子数组,当左子数组和右子数组的长度为1时,最大最小元素均为本身,当左子数组和右子数组的长度为2时,直接进行一次比 ...

  4. (c语言)编程输出二维数组中元素的最大值,要求用指针实现。

    (c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...

  5. 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。

    题目:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中,m和n的值由用户键盘输入.已知m和n的值都不超过10. void InputArray( ...

  6. C语言数组练习-计算数组中元素的最大值及其所在的行列下标值

    要求:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中m和n的值由用户键盘输入.已知m和n的值都不超过10. ----------------- ...

  7. 分治法查找数组元素的最大值和最小值(python实现)

    实验内容 给定任意几组数据,利用分治法的思想,找出数组中的最大值和最小值并输出 实验原理 利用分治法,将一个数组元素大于 2 的数组分成两个子数组,然后对每一个子数组递归调用,直到最小的子数组的元素个 ...

  8. 第k大的数python代码_Python实现查找数组中任意第k大的数字算法示例

    本文实例讲述了Python实现查找数组中任意第k大的数字算法.分享给大家供大家参考,具体如下: 模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候, ...

  9. c语言在数组中找最小数,C语言 查找数组中最大最小元素

    //findMax.c /** 查找数组中最大,最小的元素. */ #include #include #include void main() { int array[10];// int Y=10 ...

最新文章

  1. Python局域网socket无法连接的问题解决
  2. Linux(五) 权限
  3. 小米笔记本充电实测追求速度牺牲兼容性小米笔记本充电驱动_是海尔?也是雷神?不足1千克MixBook Air超轻薄笔记本...
  4. django settings 定义的变量不存在_使用Django部署机器学习模型(1)
  5. Lenovo 媽媽咪啊,坑爹麼?(Win 7 整合 USB3 NVME )驅動
  6. MFC - CStdioFile 读取txt文件UNICODE 中文异常
  7. python系统下载-python
  8. 015.4守护线程和join
  9. arcgis重心迁移分析_ArcGIS支持下三峡库区适度人口重心迁移研究
  10. p6spy 简单使用
  11. iic总线的仲裁机制_iic总线
  12. 黑苹果安装经验整理|再见丁小果
  13. 生日提醒功能-提前三天
  14. siki学院的飞机大作战UE4.26代码
  15. 编写python程序实现分段函数_python分段函数如何编写?_后端开发
  16. 打造XP系统万能克隆-Ghost全攻略
  17. 深入剖析DHCP服务IP地址自动分配原理
  18. 各种十进制转十六进制的方法
  19. MAC Iterm 支持命令行翻译中英文
  20. 如何快速在线扫描文档?Web TWAIN SDK 教你轻松解决

热门文章

  1. Conexant HD audio无法内录的问题
  2. 计算机软件基础教程刘彦明,软件技术基础教程
  3. 黑马程序员---自学随堂笔记----正则表达式
  4. 【游戏开发】简易实现回合制游戏
  5. Yubikey硬件密钥 与 SSH认证
  6. 如何在Photoshop中使用剪贴蒙版(而非图层蒙版)
  7. 几种常见无线摄像头的传输距离比较
  8. 基于springboot的健身房管理系统(mysql)-JAVA.VUE【数据库设计、论文、源码、开题报告】
  9. 开始读redis的源码了
  10. 加在形参上,spring的@NonNull和lombok的@NonNull的区别