N个元素中选最大最小

问题描述:从N个元素中,选出最大元素和最小元素。分析复杂度。

方法:

方法有三种。

方法一:

最笨的方法,循环一次找出最大的算素。再循环一下找到最小的。这里2次循环可以放在一起,作为小小的优化。比较次数:2* (N – 1) = 2N – 2。

代码:

void select_Max_Min_1(int *a,int n,int &Max,int &Min)
{int i;int kmax,kmin;kmax=kmin=0;for(i=1; i<n; ++i){if(a[i]>a[kmax])  kmax=i;if(a[i]<a[kmin])  kmin=i;}Max=a[kmax];Min=a[kmin];}

方法二:

取前两个元素比较出大小,取较大的元素与其余元素比较,得出最大值;取较小的元素与其余元素比较,得出最小值。

比较次数:1 + 2* (N – 2 + 1 – 1) = 2N – 3。

从这里我们可以看出,N个元素比较最大,需要N-1次比较。找出最小也需要N-1次比较。如果2个问题分开看,这是基本的需求。不过,当2个问题放到一起,原先每个问题中解决的子问题是有关系的。即,如果是将2个问题单独的存在时的方法简单的合到一起时(如方法1),里面会有很多重复的操作。如果我们能尽可能的减少这样的操作,方法的复杂度就会降低(如方法2)。

显然,方法2还可以优化。

代码:

void select_Max_Min_2(int *a,int n,int &Max,int &Min)
{int i;int kmax,kmin;if(a[0]>a[1]){kmax=0;kmin=1;}else{kmax=1;kmin=0;}for(i=2; i<n; ++i){if(a[i]>a[kmax])  kmax=i;if(a[i]<a[kmin])  kmin=i;}Max=a[kmax];Min=a[kmin];}

方法三:

每相邻2个元素比较,较大的放后面,较小的放前面。在较大的元素中,找最大的。在较小的元素中找最小的。

odd:o((3n-3)/2) N为奇数

even:o(3n-4)/2) N为偶数

代码:

///这里注意序号的关系,其余都很好理解。

void select_Max_Min_3(int *a,int n,int &Max,int &Min)
{int i,temp;int kmin=0,kmax=1;if(n%2)     ///奇数{for(i=0; i<n-1; i+=2){if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}for(i=3; i<n-1; i+=2){if(a[i]>a[kmax])    kmax=i;if(a[i-1]<a[kmin])  kmin=i-1;}if(a[kmax]<a[n-1])   kmax=n-1;if(a[kmin]>a[n-1])  kmin=n-1;Max=a[kmax];Min=a[kmin];}else        ///偶数{for(i=0; i<n; i+=2){if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}for(i=3; i<n; i+=2){if(a[i]>a[kmax])    kmax=i;if(a[i-1]<a[kmin])  kmin=i-1;}Max=a[kmax];Min=a[kmin];}
}

分析:

N为偶数好分析,就先说偶数情况。

N为偶数时,相邻元素比较N/2次,在每个N/2个元素中分别找最大最小,2* (N/2-1)。

共计:N / 2+ 2 * (N/ 2 – 1) =3N/2 – 2。

N为奇数时,N-1为偶数,用偶数方法得出N-1个元素中的最大最小,带入上面的式子。3(N-1) / 2 – 2。剩下一个元素分别与得出的最大最小比较,得出最终的最大最小值。

共计:3(N-1 )/ 2 – 2 + 2 = (3N – 3 ) / 2。

N个元素中选最大最小相关推荐

  1. Java 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    package cn.zhang;import java.util.Arrays; import java.util.Scanner;public class Subject001 {/** 输入数组 ...

  2. Java输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    import java.util.Scanner; public class WorkDemo03 { public static void main(String[] args) {        ...

  3. java 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组

    import java.util.*; class HW {public static void main(String[] args){int N = 6;int[] arr = new int[N ...

  4. 线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中字符按字母字符、数字字符和其他字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。

    线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中字符按字母字符.数字字符和其他字符的顺序排列.要求利用原来的存储空间,元素移动次数最小. int fch(char c) ...

  5. 哈希表中能有相同元素吗_最小删除以使用哈希表使所有元素相同

    哈希表中能有相同元素吗 Prerequisite: Hashing data structure 先决条件: 哈希数据结构 Problem statement: 问题陈述: Find minimum ...

  6. LeetCode 1551. 使数组中所有元素相等的最小操作数(等差数列)

    文章目录 1. 题目 2. 解题 1. 题目 存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两 ...

  7. 【周赛-简单】5488. 使数组中所有元素相等的最小操作数

    存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= ...

  8. Leetcode5488. 使数组中所有元素相等的最小操作数【第 202场周赛】【水】

    题目链接 题意:存在一个长度为 n n n的数组 a r r arr arr,其中 a r r [ i ] = ( 2 ∗ i ) + 1 ( 0 < = i < n ) arr[i]=( ...

  9. leetcode 5488. 使数组中所有元素相等的最小操作数(C++)

    存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= ...

  10. 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    import java.util.Scanner;public class Test6 {public static void main(String[] args) {// TODO Auto-ge ...

最新文章

  1. Linux中检查本地系统上的开放端口列表的方法
  2. Ubuntu15.10的64位版本启动eclipse+adt时的若干问题
  3. HDU 6301.Distinct Values-贪心、构造字典序最小的数列 (2018 Multi-University Training Contest 1 1004)...
  4. android 图片缩放算法,Android大图加载,缩放,滑动浏览--SubsamplingScaleImageView 源码分析大图加载...
  5. PHP——MySQL数据库分页查询
  6. java date 最小值_java – Datepicker和timepicker – 设置最大值和最小值
  7. memcached和redis的区别
  8. [Android]AndroidInject增加sqlite3数据库映射注解(ORM)
  9. SQLi LABS Less-34
  10. 【大数据部落】IBM SPSS Modeler通过数据挖掘我们能从股市数据得到什么
  11. Ctrl+Shift+End
  12. 如何卸载手机系统自带应用(无需root)?【亲测有用】
  13. 微信小程序开发入门需要学什么?
  14. java md5类_java的md5加密类
  15. 超详细open vn搭建之Linux亲测可用
  16. 浅析web应用防火墙的反向代理部署
  17. Ubuntu 启动盘制作教程
  18. 三个值得关注的零撸空投项目,请收藏
  19. 常见模拟电路设计 二 (含仿真) : 单片机ADC测量正负电压电路设计
  20. 如何打造微产业生态链

热门文章

  1. 曲线拟合(多项式函数+MATLAB实例)
  2. python 打开文件夹与开启文件的几种方式
  3. 磨刀不误砍柴工——实验工具准备
  4. signature=99daf37ca32015c39987d04abe5a559d,合肥2015年7月4日至2015年7月16日交通违章查询...
  5. Android利用NotificationListenerService实现消息盒子功能
  6. 小赛毛游C记——初识C语言(1)
  7. 提问的力量(一):提问在学习中的价值
  8. 做跨境电商一年买了房: 未来五年的风口行业,90%的人都不知道 !
  9. 复合梯形公式matlab代码,复合梯形公式
  10. 易虎再谈网站被恶意刷流量和防恶意点击的解决思路