matlab 求数组最大值第二(n)大值及下标

...................................
求数组第二(n)大值及下标
问:给定一个整型数组,数组成员10个,求该数组中第二大的数和下标
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("输入10个整型数组元素的值: ");
int[] Arrays = new int[10];
for(int i = 0; i& Arrays. i++)
Arrays[i] = input.nextInt();
int A = secondBigOfIndex(Arrays);
System.out.println(A);
//方法实现:需要第几大的元素就声明几个max
public static int secondBigOfIndex(int[] Arrays){
int max = Arrays[0];
int max2 = Arrays[1];
for(int i = 0; i & Arrays. i++){
// 更新最大值和次大值
if(max & Arrays[i]){
max = Arrays[i];
}else if((max&Arrays[i])&&(Arrays[i]&max2)){
//更新次大值
max2 = Arrays[i];
int index =
System.out.println("下标:"+index);
return max2;
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!怎样用c语言找出一维数组(有9个元素,由键盘任意输入的)中的第二大值和第三大值并输出下标?
[问题点数:20分]
本版专家分:0
CSDN今日推荐
本版专家分:215
本版专家分:0
本版专家分:9703
2014年1月 C/C++大版内专家分月排行榜第三
本版专家分:996
2014年6月 C/C++大版内专家分月排行榜第二
本版专家分:996
2014年6月 C/C++大版内专家分月排行榜第二
本版专家分:3201
本版专家分:433030
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:61
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐题目:要求一个数组连续下标和的最大值,数组的元素可正、可负、可为零,例如-2,5,3,-6,4,-8,6将返回8。这题是很经典的一道面试题,也有各种解法,从算法分析上,时间复杂度也有很大差别,下面我就给出三种不同的解法。方法一:暴力枚举法此种方法最简单,我想应该也是每个人拿到题目想到的第一种解法了,学过一点编程的人都应该能编出此类程序。记sum[i..j]为数组中第i个元素到第j个元素的和(其中0&=i&j&=n-1),通过遍历所有的组合之和,就能找到最大的一个和了。伪代码如下:int maxSubArray(int *A,int n) {&&& int maxium = -INF; //保存最大子数组之和&&& for i=0 to n-1 do &&&&&&& sum = 0; //sum记录第i到j的元素之和&&&&&&& for j=i to n-1 do&&&&&&&&&&& sum += A[j];&&&&&&& if sum&maxium do //更新最大值 &&&&&&&&&&& maxium = &&&}此种方法的时间复杂度为O(n2),显然不是一种很好的办法,也不是公司面试希望你写出这样的程序的。方法二:分支界定这里再介绍一种更高效的算法,时间复杂度为O(nlogn)。这是个分治的思想,解决复杂问题我们经常使用的一种思维方法——分而治之。而对于此题,我们把数组A[1..n]分成两个相等大小的块:A[1..n/2]和A[n/2+1..n],最大的子数组只可能出现在三种情况:&&& A[1..n]的最大子数组和A[1..n/2]最大子数组相同;&&& A[1..n]的最大子数组和A[n/2+1..n]最大子数组相同;&&& A[1..n]的最大子数组跨过A[1..n/2]和A[n/2+1..n]前两种情况的求法和整体的求法是一样的,因此递归求得。第三种,我们可以采取的方法也比较简单,沿着第n/2向左搜索,直到左边界,找到最大的和maxleft,以及沿着第n/2+1向右搜索找到最大和maxright,那么总的最大和就是maxleft+maxright。而数组A的最大子数组和就是这三种情况中最大的一个。伪代码如下:int maxSubArray(int *A,int l,int r) {&&& if l&r do &&&&&&& mid = (l+r)/2;&&&&&&& ml = maxSubArray(A,l,mid); //分治 &&&&&&& mr = maxSubArray(A,mid+1,r);&&&&&&& for i=mid downto l do &&&&&&&&&&& &&&&&&& for i=mid+1 to r do &&&&&&&&&&& &&&&&&& return max(ml,mr,maxleft+maxright); //归并 &&&&&&& then //递归出口 &&&&&&&&&&& return A[l]; }方法三:动态规划这算是一个经典的动态规划的题目了,如果不知道动态规划可以先不去理解这个名词。用通俗点的语言描述这个算法就是:令cursum(i)表示数组下标以i为起点的最大连续下标最大的和,而maxsum(i)表示前i个元素的最大子数组之和。那么我们就可以推出下一个maxsum(i+1)应该为cursum(i+1)和maxsum(i)中选取一个最大值。递推式为:cursum(i) = max{A[i],cursum(i-1)+A[i]};maxsum(i) = max{maxsum(i-1),cursum(i+1)};伪代码为:int maxSubArray(int *A,int n) { &&& cursum = A[0]; &&& maxsum = A[0];&&& for i=1 to n-1 do&&&&&&& /*当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。*/ &&&&&&& if cursum&0 do &&&&&&&&&&& cursum = 0;&&&&&&& cursum += A[i]; &&&&&&& if cursum&maxsum do&&&&&&&&&&& maxsum = &&& }这种算法时间复杂度只是O(n),效果非常好!具体实现代码如下:#include&&iostream&#include&&iterator&#include&&algorithm&#include&&cstdlib&#include&&ctime&using&namespace&const&int&INF=0x7fffffff;int&max_sub_array(int&arr[],int&n,int&&left,int&&right){&&&&int&maxium=-INF;&&&&int&&&&&for(int&i=0;i&n;i++){&&&&&&&&sum=0;&&&&&&&&for(int&j=i;j&n;j++){&&&&&&&&&&&&sum+=arr[j];&&&&&&&&&&&&if(sum&maxium){&&&&&&&&&&&&&&&&maxium=&&&&&&&&&&&&&&&&left=i;&&&&&&&&&&&&&&&&right=j;&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&return&}int&max_sub_array(int&arr[],int&l,int&r,int&&left,int&&right){&&&&if(l&r){&&&&&&&&int&mid=(l+r)/2;&&&&&&&&int&ll,&&&&&&&&int&suml=max_sub_array(arr,l,mid,ll,lr);&&&&&&&&int&rl,&&&&&&&&int&sumr=max_sub_array(arr,mid+1,r,rl,rr);&&&&&&&&int&sum_both=0;&&&&&&&&int&max_left=-INF;&&&&&&&&int&ml,&&&&&&&&for(int&i=i&=l;i--)&&&&&&&&{&&&&&&&&&&&&sum_both+=arr[i];&&&&&&&&&&&&if(sum_both&max_left){&&&&&&&&&&&&&&&&max_left=sum_&&&&&&&&&&&&&&&&ml=i;&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&int&max_right=-INF;&&&&&&&&sum_both=0;&&&&&&&&for(int&i=mid+1;i&=r;i++)&&&&&&&&{&&&&&&&&&&&&sum_both+=arr[i];&&&&&&&&&&&&if(sum_both&max_right){&&&&&&&&&&&&&&&&max_right=sum_&&&&&&&&&&&&&&&&mr=i;&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&sum_both=max_left+max_&&&&&&&&if(suml&sumr)&{&&&&&&&&&&&&if(sumr&sum_both)&{&&&&&&&&&&&&&&&&left=&&&&&&&&&&&&&&&&right=&&&&&&&&&&&&&&&&return&sum_&&&&&&&&&&&&}&&&&&&&&&&&&else&{&&&&&&&&&&&&&&&&left=&&&&&&&&&&&&&&&&right=&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&else{&&&&&&&&&&&&if(suml&sum_both)&{&&&&&&&&&&&&&&&&left=&&&&&&&&&&&&&&&&right=&&&&&&&&&&&&&&&&return&sum_&&&&&&&&&&&&}&&&&&&&&&&&&else&{&&&&&&&&&&&&&&&&left=&&&&&&&&&&&&&&&&right=&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&else&{&&&&&&&&left=l;&&&&&&&&right=r;&&&&&&&&return&arr[l];&&&&}}int&max_sub_array_(int&arr[],int&n,int&&left,int&right){&&&&int&cursum=arr[0];&&&&int&maxsum=arr[0];&&&&int&pos=0;&&&&pos=0;&&&&for(int&i=1;i&n;i++)&{//&&&&&&&&if(cursum&0)//&&&&&&&&&&&&cursum=0;&&&&&&&&cursum+=arr[i];&&&&&&&&if(cursum&arr[i])&&&&&&&&{&&&&&&&&&&&&pos=i;&&&&&&&&&&&&cursum=arr[i];&&&&&&&&}&&&&&&&&if(cursum&maxsum)&&&&&&&&{&&&&&&&&&&&&maxsum=&&&&&&&&&&&&left=&&&&&&&&&&&&right=i;&&&&&&&&}&&&&}&&&&return&}void&test1(){&&&&int&arr[]={-2,5,3,-6,4,-8,6};&&&&int&len=sizeof(arr)/sizeof(arr[0]);&&&&int&left,&&&&int&&&&&cout&&"arr:";&&&&copy(arr,arr+len,ostream_iterator&int&(cout,&"&"));&&&&cout&&&&&&sum=max_sub_array(arr,len,left,right);&&&&cout&&"method1:("&&left&&","&&right&&")&&";&&&&cout&&"sum="&&sum&&&&&&sum=max_sub_array(arr,0,len-1,left,right);&&&&cout&&"method2:("&&left&&","&&right&&")&&";&&&&cout&&"sum="&&sum&&&&&&sum=max_sub_array(arr,len,left,right);&&&&cout&&"method3:("&&left&&","&&right&&")&&";&&&&cout&&"sum="&&sum&&}void&test2(){&&&&const&int&LEN=10;&&&&int&arr[LEN];&&&&int&sign[LEN];&&&&srand(time(0));&&&&for(int&i=0;i&LEN;i++){&&&&&&&&int&val=rand()%1000;&&&&&&&&if(val%2==0)&&&&&&&&&&&&sign[i]=1;&&&&&&&&else&&&&&&&&&&&&sign[i]=-1;&&&&}&&&&for(int&i=0;i&LEN;i++){&&&&&&&&int&val=rand()%100;&&&&&&&&arr[i]=val*sign[i];&&&&}&&&&int&left,&&&&int&&&&&int&len=LEN;&&&&cout&&"arr:";&&&&copy(arr,arr+len,ostream_iterator&int&(cout,&"&"));&&&&cout&&&&&&sum=max_sub_array(arr,len,left,right);&&&&cout&&"method1:("&&left&&","&&right&&")&&";&&&&cout&&"sum="&&sum&&&&&&sum=max_sub_array(arr,0,len-1,left,right);&&&&cout&&"method2:("&&left&&","&&right&&")&&";&&&&cout&&"sum="&&sum&&&&&&sum=max_sub_array(arr,len,left,right);&&&&cout&&"method3:("&&left&&","&&right&&")&&";&&&&cout&&"sum="&&sum&&}int&main(){&&&&test2();}&其中test1函数是题目给出的数组测试,test2是进行随机产生数来测试。大致的效果如下:test1测试:&test2测试:&&参考:http://www.cnblogs.com/hazir/archive//2447289.html &&&&
阅读(...) 评论()找出二维数组中的最大值 并写出它的下标 求完善【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:583,239贴子:
找出二维数组中的最大值 并写出它的下标 求完善收藏
#include &stdio.h&void main(){
int i,j,max,r,c;
int a[3][4];//={12,11,10,9,8,7,65,5,4,3,2,1};
for(i=0;i&3;i++)
for(j=0;j&4;j++)
scanf("%d",&a[i][j]);
max=a[0][0];
for(i=0;i&3;i++)
for(j=0;j&4;j++)
if(a[i][j]&max)
max=a[i][j];
printf("最大元素位于第%d行,第%d列,是%d\n",r+1,c+1,max);}我的这个程序是把 二维数组a[3][4] 中的最大元素找出来现在我想把这个程序改进一下二维数组a[m][n] 这个用动态内存怎么分配?malloc这个函数不是很会用 虚心求教
c语言,博为峰IT培训免费试听,0元入学,现在更有多重优惠,仅限今天!博为峰,真正的为年轻人服务的企业,14年间培训15万余名it工程师,成绩斐然!
???????????????????????????????????
路过帮顶。
lude &stdio.h&#include &stdlib.h&int main(){ int i,j,max,r,c; int m,
//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout); scanf("%d%d", &m, &n); int **a = (int **)malloc(sizeof(int*)*m); for(i=0; i&m; i++)
a[i] = (int*)malloc(sizeof(int)*n); for(i=0; i&m; i++)
for(j=0;j&n;j++)
scanf("%d",&a[i][j]); max = a[0][0]; for(i=0;i&m;i++) for(j=0;j&n;j++) if(a[i][j]&max) {
max=a[i][j];
c=j; } printf("最大元素位于第%d行,第%d列,是%d\n",r+1,c+1,max);
return 0;}测试:3 41 2 3 45 6 7 1120 3 8 99最大元素位于第2行,第4列,是112
版#include &stdio.h&#include &stdlib.h&int main(){ int i,j,max,r,c; int m,
//freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); scanf("%d%d", &m, &n);
//以下3行是楼主关心的~呵呵 int **a = (int **)malloc(sizeof(int*)*m); for(i=0; i&m; i++)
a[i] = (int*)malloc(sizeof(int)*n); for(i=0; i&m; i++)
for(j=0;j&n;j++)
scanf("%d",&a[i][j]); max = a[0][0]; for(i=0;i&m;i++) for(j=0;j&n;j++) if(a[i][j]&max) {
max=a[i][j];
c=j; } printf("最大元素位于第%d行,第%d列,是%d\n",r+1,c+1,max);
return 0;}测试:3 41 2 3 45 6 7 1120 3 8 99最大元素位于第2行,第4列,是112
你那个程序运行不了啊!
你知道怎么改你那个程序吗?他说的那个还得自己输入值,你那个怎么改就行了?
登录百度帐号算法设计:如何求数组中第2大的数
一种思路是利用两次冒泡法,因为第一次冒泡,最大的在a[n-1],第二次冒泡后,次最大值在a[n-2]这样直接返回即可。核心代码如下:
for(int i=0; i&2; i++)
for(int j=0; j&n-i-1; j++)
if(a[j] &a[j+1])
swap(a[j], a[j+1]);
return a[n-2];
但是这样做,显然效率不够高,几乎要遍历两次,有没有遍历一次就可以找到呢?
第二种思路:
首先看源码:
int find2Max(int a[], int n)
int max1 = 0;
int max2 = 0;
for(int i=1; i&n; i++)
if(a[i] & a[max1])
max2 = max1;
else if(a[i] &
a[max2] && a[i] & a[max1])
return max2;
首先设置两个索引max1,max2,分别用来存最大的和次最大的索引。然后遍历一次,当a[i] & a[max1]时是一种情况,要进行交换;另外当a[i] & a[max1] 同时a[i] & a[max2]时,这种情况也要进行处理。注意,max1、max2的索引初值均为0, 有的人把max2设成-1,这是不够严密的。另外,就是遍历的时候,从第二个数开始遍历即可,即i = 1开始往后遍历。
这个算法的复杂度是o(n),问题似乎很好解决了,但试问有比这更快的方法吗?而且,如果不是让找第二大的数,而是找第三大、第四大、第五大,或者第三小、第4小的数,上面这种思路显然是走不通的。肿么办? 下篇接着说。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 c 求数组最大值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信