求数组次大指

在一维整型数组中找出比数组元素最大值小的次大元素的下标,有一个符合条件元素则输出一个下标,有多个符合条件元素则输出多个下标。其中,寻找次大元素下标的函数原型为:int findSecondMax(int *p, const int len);

#include<stdio.h>

#include<stdlib.h>

int main(void)

{

int a[8]={1,3,8,2,9,5,4,8};  //定义数组

int i;//定义变量

int findSecondMax(int *p, const int len);  //函数声明语句

printf("一维数组中的元素是:");

for( i=0 ; i<8 ; i++)

{

printf("%d ",a[i]);

}

printf("\n");

findSecondMax(a, 8);   //调用函数

printf("\n");

system("pause");

return 0;

}

int findSecondMax(int *p, const int len)    //函数的定义

{

int i,max,semax,count=0;  //定义最大值和最小值变量

max=semax=p[0];

for(i=0;i<len;i++)   //通过循环找最大值

{

if(max<p[i])

{

max=p[i];

}

}

for(i=0;i<len;i++)   //找出次大值

{

if((semax<p[i])&&(p[i]<max))

{

semax=p[i];

}

}

printf("次大元素(%d)的下标是:",semax);

for(i=0;i<len;i++)    //利用循环找出次大元素下标

{

if(semax==p[i])

{

if(count!=0)

printf(",%d",i);  //如果不是第一个次大元素,前面输出一个逗号

else

printf("%d",i);   //如果是第一个次大元素,原样输出

count++;

}

}

}

找出数组中的最大值和次大值

用分治法,先求出左边的最大值leftmax和次大值leftsecond,再求出右边的最大值rightmax和次大值rightsecond,然后合并,如何合并呢?分情况考虑

1 如果leftmax > rightmax,那么可以肯定leftmax是最大值,但次大值不一定是rightmax,但肯定不是rightsecond,只需将leftsecond与rightmax做一次比较即可。

2 如果rightmax > leftmax,那么可以肯定rightmax是最大值,但次大值不一定是leftmax,但肯定不是leftsecond,所以只需将leftmax与rightsecond做一次比较即可。

[html] view
plain
copy

  1. // 找出数组的最大值和次大值,a是待查找的数组,left和right是查找区间,max和second存放结果
  2. void MaxandSec(int a[], int left, int right, int&max, int&second)
  3. {
  4. if(left == right)
  5. {
  6. max = a[left] ;
  7. second =  INT_MIN;
  8. }
  9. else if(left +1== right)
  10. {
  11. max = a[left] > a[right] ? a[left] : a[right] ;
  12. second = a[left] < a[right] ? a[left] : a[right] ;
  13. }
  14. else
  15. {
  16. int mid =(right + left) /2 ;
  17. int leftmax ;
  18. int leftsecond ;
  19. MaxandSec(a, left, mid, leftmax, leftsecond) ;
  20. int rightmax ;
  21. int rightsecond ;
  22. MaxandSec(a, mid +1, right, rightmax, rightsecond) ;
  23. if (leftmax > rightmax)
  24. {
  25. max = leftmax ;
  26. second = leftsecond > rightmax ? leftsecond : rightmax ;
  27. }
  28. else
  29. {
  30. max = rightmax ;
  31. second = leftmax < rightsecond ? rightsecond : leftmax ;
  32. }
  33. }
  34. }
时间: 2024-10-01 20:18:59

求数组次大指的相关文章

求数组第二大的数(选择排序)

定义一个最大 和第二大的数 每次循环都判断数组中是否有比最大的数大的有则交换两者的值同时 把原来最大数的值赋值给第二大的 public class SecondMax { public static int FindSecMax(int[] data) { int count = data.length; int maxnumber = data[0]; int sec_max = Integer.MIN_VALUE; for(int i = 1;i<count;i++) { if(data[i

C++求数组最小(大)n位数字的数组解法

#include <iostream> using namespace std; void InitIt(int b[],int n)//插入排序 { int j = n; int flags = j - 1; if (flags<0)return; for (; flags >= 0; flags--) { if (b[j] > b[flags]) break; } int temp = b[j]; for (; j > flags+1 ; j--) { b[j] =

HDU 5249 离线树状数组求第k大+离散化

KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1160    Accepted Submission(s): 488 Problem Description 你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度.数十亿的请求被推到一个大管道后同时服务从管头拉取请求.让我们来定义每个请求都有一个重要值.我的

求数组的最大值和次大值

#include <stdio.h> #include <stdlib.h> /* 求数组的最大值和次大值. */ int main() { int n; while (printf("Please input n:\n"),fflush(stdin), scanf("%d", &n) != EOF){ if (n < 2){ printf("Please input a bigger number.\n")

hdu 2985 The k-th Largest Group 树状数组求第K大

The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted: 2712 Description Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is really huge, Newman wants to g

腾讯面试题之求数组前小后大划分元素

时间:2014.04.29 地点:基地二楼 --------------------------------------------------------------------------------------- 一.题目 整型数组里找出符合要求的元素,满足前面的元素比该元素小,后面的元素比该元素大. 时间复杂度为:O(n) 原理:另外开辟两个数组,初始化为原数组值,一个用于存储到当前元素为止前面部分的最大值,另一个用于存储到当前元素为止,后面部分的最小值.最后用当前元素和最大值数组和最小

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

《数据结构与算法分析:C语言描述》读书笔记------练习1.1 求第K大的数

求一组N个数中的第k个最大者,设k=N/2. 1 import java.util.Random; 2 3 4 public class K_Max { 5 6 /** 7 * @param args 8 */ 9 //求第K大的数,保证K大于等于1,小于等于array.length/2哦 10 public static int TopK(int array[],int K) 11 { 12 int topk[] = new int [K]; 13 for(int i = 0; i<topk.