N个元素中选最大最小
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个元素中选最大最小相关推荐
- Java 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
package cn.zhang;import java.util.Arrays; import java.util.Scanner;public class Subject001 {/** 输入数组 ...
- Java输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
import java.util.Scanner; public class WorkDemo03 { public static void main(String[] args) { ...
- java 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
import java.util.*; class HW {public static void main(String[] args){int N = 6;int[] arr = new int[N ...
- 线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中字符按字母字符、数字字符和其他字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。
线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中字符按字母字符.数字字符和其他字符的顺序排列.要求利用原来的存储空间,元素移动次数最小. int fch(char c) ...
- 哈希表中能有相同元素吗_最小删除以使用哈希表使所有元素相同
哈希表中能有相同元素吗 Prerequisite: Hashing data structure 先决条件: 哈希数据结构 Problem statement: 问题陈述: Find minimum ...
- LeetCode 1551. 使数组中所有元素相等的最小操作数(等差数列)
文章目录 1. 题目 2. 解题 1. 题目 存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两 ...
- 【周赛-简单】5488. 使数组中所有元素相等的最小操作数
存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= ...
- Leetcode5488. 使数组中所有元素相等的最小操作数【第 202场周赛】【水】
题目链接 题意:存在一个长度为 n n n的数组 a r r arr arr,其中 a r r [ i ] = ( 2 ∗ i ) + 1 ( 0 < = i < n ) arr[i]=( ...
- leetcode 5488. 使数组中所有元素相等的最小操作数(C++)
存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n ). 一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= ...
- 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
import java.util.Scanner;public class Test6 {public static void main(String[] args) {// TODO Auto-ge ...
最新文章
- Linux中检查本地系统上的开放端口列表的方法
- Ubuntu15.10的64位版本启动eclipse+adt时的若干问题
- HDU 6301.Distinct Values-贪心、构造字典序最小的数列 (2018 Multi-University Training Contest 1 1004)...
- android 图片缩放算法,Android大图加载,缩放,滑动浏览--SubsamplingScaleImageView 源码分析大图加载...
- PHP——MySQL数据库分页查询
- java date 最小值_java – Datepicker和timepicker – 设置最大值和最小值
- memcached和redis的区别
- [Android]AndroidInject增加sqlite3数据库映射注解(ORM)
- SQLi LABS Less-34
- 【大数据部落】IBM SPSS Modeler通过数据挖掘我们能从股市数据得到什么
- Ctrl+Shift+End
- 如何卸载手机系统自带应用(无需root)?【亲测有用】
- 微信小程序开发入门需要学什么?
- java md5类_java的md5加密类
- 超详细open vn搭建之Linux亲测可用
- 浅析web应用防火墙的反向代理部署
- Ubuntu 启动盘制作教程
- 三个值得关注的零撸空投项目,请收藏
- 常见模拟电路设计 二 (含仿真) : 单片机ADC测量正负电压电路设计
- 如何打造微产业生态链
热门文章
- 曲线拟合(多项式函数+MATLAB实例)
- python 打开文件夹与开启文件的几种方式
- 磨刀不误砍柴工——实验工具准备
- signature=99daf37ca32015c39987d04abe5a559d,合肥2015年7月4日至2015年7月16日交通违章查询...
- Android利用NotificationListenerService实现消息盒子功能
- 小赛毛游C记——初识C语言(1)
- 提问的力量(一):提问在学习中的价值
- 做跨境电商一年买了房: 未来五年的风口行业,90%的人都不知道 !
- 复合梯形公式matlab代码,复合梯形公式
- 易虎再谈网站被恶意刷流量和防恶意点击的解决思路