数组求大小

Aika_liu 2011-04-25 01:58:09
一个具有N个元素的数组,找出数组中的第二大的数。请求给出具体方案。
...全文
542 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyangkobe 2011-10-11
  • 打赏
  • 举报
回复

// wy.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <iterator>
#include <algorithm>
#include <ctime>
using namespace std;
int FindSecondMax(int arr[], int n)
{
int res = INT_MIN;
int max = arr[0];
for (int i = 1; i < n; ++i)
{
if(arr[i] > max)
{
res = max;
max = arr[i];
}
else if ((arr[i] > res) && (arr[i] < max))
res = arr[i];
}
return res;
}

int _tmain(int argc, _TCHAR* argv[])
{
const int N = 10;
int arr[N];
srand(time(NULL));
for (int i = 0; i < N; ++i)
arr[i] = rand()%100;
arr[8] = arr[9] = 100;
copy(arr, arr + N, ostream_iterator<int>(cout, " "));
cout<<endl;
cout<<FindSecondMax(arr, N)<<endl;
sort(arr, arr + N);
copy(arr, arr + N, ostream_iterator<int>(cout, " "));
cout<<endl;
return 0;
}


liuzhengxi2010 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhoujk 的回复:]

Top K 问题
源为 AryS,长度为 Lenth
开辟一个数组 AryA,有 K 个空间。
然后将源的前K个数放到这个空间,排序。
从下标 K + 1 开始,遍历 Arys,
如果 AryS 的当前值小于 AryA 中的最小值,就到下一个下标。
否则
{
在 AryA 中找到它的相应位置,插入,将后面的数据向下移动一个位置。这时AryA中的原最后一项就被覆盖了。
}
……
[/Quote]
江清清 2011-06-06
  • 打赏
  • 举报
回复
快速排序 然后 输入第二大的数
Haven 2011-06-03
  • 打赏
  • 举报
回复
一次冒两泡;设两个变量,一个最大,一个第二。都不错。学习了。
querdaizhi 2011-06-02
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

int main()
{
int n;
cin >> n;
int i;
int max=0 ,second=0;
for(i=0;i<n;i++)
{
int a;
cin >> a;
if(a>max)
{
second =max;
max = a;
}
else if(a>second && a<max)
{
second=a;
}
}
cout<<second<<endl;
return 0;
}

wts521 2011-06-01
  • 打赏
  • 举报
回复
这个不难,很容易的
如此美丽的你 2011-05-31
  • 打赏
  • 举报
回复
if(a>max) max=a;
else if(a>max2) max2=a;
CSDNCFO 2011-05-31
  • 打赏
  • 举报
回复
这个不麻烦吧?
楼上的就很简单啊
chxfalling 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 cnmhx 的回复:]

循环遍历一遍,记录max,second,两个变量,每次更新max,second即可!,
[/Quote]


支持~ o(n), over ~
turbsky2010 2011-05-16
  • 打赏
  • 举报
回复
每天只要回复就可以获得10个可用分
icessl 2011-05-16
  • 打赏
  • 举报
回复
如果先排序,再取值,那么时间耗费至少是 O(nlogn);
如果执行两次扫描:第一次查找最大值,第二次查找次大值,那么,时间耗费是O(n),比较次数是 n-1+n-2=
2n-3.
其实,我们可以用更好的办法找出最大值和次大值,使用的比较次数不超过n+[logn]-2次.
显然,次大值,是在那些与最大值比较过一次但失败了的值中选取.所以,我们在查找最大值时,不仅要记录
最大值本身,还要记录哪些值与最大值比较了一次.所以,我们把"查找最大值"算法修改如下:

// 查找最大值算法,返回一个链表.该链表的首元素是最大值,其它元素均是与最大元素比较了一次的元素
Queue FindMax(SET s)
{
if (|s|<1) return NULL; // 如果 s 是空集合,返回空链表;
if (|s|==1) return {s[0]}; // 如果 s 只有一个元素,返回由该元素组成的单元素链表

SET s1,s2; // 定义两个集合
Queue q1,q2; // 定义两个链表

把 s 划分成两个大小大致相同的子集,存入 s1 和 s2; // s1 和 s2 的元素个数最多相差 1
q1=FindMax(s1); // 递归地在 s1 中查找最大值
q2=FindMax(s2); // 递归地在 s2 中查找最大值
if (q1 的头元素值>q2 的头元素值)
{
把q2 头元素值放入 q1中;
return q1;
}
else
{
把q1的头元素值放入 q2 中;
return q2;
}
}

有了上面的函数,查找最大值和次大值就可以这样做:

STEP1: 调用 FindMax 算法得到链表 Q;
STEP2: if (Q 是空)返回"没有最大值";
STEP3: if (Q 只有一个元素) 返回"只有最大值,没有次大值"
STEP4: 最大值是 Q 的头元素,令它是 max1;
STEP5: 在 Q 的非首元素中那么最大值,令它是 max2
STEP6: 返回 max1 和 max2

feng19880226 2011-05-11
  • 打赏
  • 举报
回复
int findK(int *a,int p,int q,int k)
{
if(p==q)
return a[p];
int r=partition(a,p,q);
int i=r-p+1;
if(k==i)
return a[r];
else if(k<i)
return findK(a,p,r-1,k);
else return findK(a,r+1,q,k-i);
}
int partition(int *a,int p,int q)
{
int main_mem=a[p];
int l=p;
int r=q;
while(l<r)
{
while(a[l]<main_mem)
{
l++;
}
while(a[r]>=main_mem)
{
r--;
}

if(l<r)
{
int temp=a[l];
a[l]=a[r];
a[r]=temp;
}
}
/*for(int i=p;i<=q;i++)
{
cout<<a[i]<<" ";
}*/
return l;
}
利用快速排序的思想来做 可在线性时间完成
zyj_604 2011-05-11
  • 打赏
  • 举报
回复
如果是第二大,如2楼
如果是第K大,那就可以先排序,然后再查找啊
xxjjs 2011-05-10
  • 打赏
  • 举报
回复
这么简单的问题?拒绝作业题啊~~~~
zd8582zd 2011-05-10
  • 打赏
  • 举报
回复
可以先将数组进行排序,在取第二大就非常简单了
shenhua556 2011-05-10
  • 打赏
  • 举报
回复
最简单...排序..然后提取数组中的第二个数...
feng19880226 2011-05-09
  • 打赏
  • 举报
回复
top k问题很多啊
Sunday 2011-05-05
  • 打赏
  • 举报
回复
STL中的nth_element就可,不会用的话google一下
超级大笨狼 2011-05-05
  • 打赏
  • 举报
回复
寻找前K大,都是O(n)的
voldy 2011-04-29
  • 打赏
  • 举报
回复
冒泡以后输出a[1]不行吗?
加载更多回复(24)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧