10000个数求第2大的数,不许用排序算法.谁有没有什么好的方法??

nujiah001 2010-03-09 09:37:36
10000个数求第2大的数,不许用排序算法.谁有没有什么好的方法??
谢谢了
...全文
1004 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sniperjjs 2011-11-07
  • 打赏
  • 举报
回复
LS威武,好牛逼的方法名!
Dazzlingwinter 2010-03-10
  • 打赏
  • 举报
回复

public class BigNum {
public static void main(String[] args) {
int[] a = new int[]{1,684,-2,1564,6564,65,465,-465,464874,464874,464874,464874,9874,9546,-54,65,46,568,8,4685,6,8,46,846,8,6,8446,86,46,8,464874};
if(null != a && a.length>2) printTheFirstBigNumAndTheSecondBigNumInIntArray(a);
}

public static void printTheFirstBigNumAndTheSecondBigNumInIntArray(int[] a) {
int fMax = a[0];
int sMax = a[1];

if(fMax < sMax) {
fMax += sMax;
sMax = fMax - sMax;
fMax = fMax - sMax;
}

for(int i=2; i<a.length; i++) {
if(fMax < a[i]) {
if(sMax < fMax) {
sMax = fMax;
}
fMax = a[i];
}else {
if(fMax != a[i] && sMax < a[i]) {
sMax = a[i];
}
}
}
System.out.println("fMax:\t" + fMax + "\nsMax:\t" + sMax);
}
}
jxygjzh04 2010-03-10
  • 打赏
  • 举报
回复
引用 4 楼 redduke1202 的回复:
遍历一遍就行了

int[] all;//10000个数字
int max,max2;//第一大,第二大数字
int v;

max = max2 = all[0];
for(int i=1;i <10000;i++){
  v = all[i];
  if(v > max2){
      if(v > max){
          max2 = max;//原来最大值变第二大
          max = v;//最大值更新为当前值
      }
      else
          max2 = v;//当前值为第二大
  }
}
System.out.println("max="+max+",max2="+max2);



如果数组中有相等的值的话...如.{ 1, 3, 5, 7, 9, 2, 4, 6, 10, 10 }
结果 max=10,max2=10

max2 :"咱们一样大,为什么你排在我前面"
max :"你那个10是雌的,我的是雄的...."

修改一下判断 应该就可以了...
icy_csdn 2010-03-10
  • 打赏
  • 举报
回复
呵呵,都没有注意一个细节,如果数中有负数呢?显然第二大数就会出错。

int[] all; //10000个数字
int max,max2; //第一大,第二大数字
int v;

max = all[0];
max2 = Integer.MIN_VALUE; // here
for(int i=1;i <10000;i++){
if( all[i]>max){
max = all[i];
}else if(all[i]>max2){
max2 = all[i];
}
}
System.out.println("max="+max+",max2="+max2);
Dazzlingwinter 2010-03-10
  • 打赏
  • 举报
回复
这里说的第二大是什么意思?
是升序排的倒数第二个还是无重复升序排后的第二个呢?
举个例子:2, 2, 1, 3, 3, 4, 4
这几个数,第一大肯定是4了,第二大是4还是3呢?
DEMONSINE 2010-03-10
  • 打赏
  • 举报
回复
弱弱的问下 怎么用分治法求第二大的数
DEMONSINE 2010-03-10
  • 打赏
  • 举报
回复
额 我的好像说错了 我的是错的
我道歉
whut_lcy 2010-03-10
  • 打赏
  • 举报
回复
为什么不用TreeSet呢?
Set set = new TreeSet();
set.add(new Integer(first));
set.add(new Integer(second));
..............................

int result = ((Integer)set.get(99998)).intValue(); //一共10000个,set自动按照asc有序存储了.第二大的数字自然是倒数第二个了
DEMONSINE 2010-03-10
  • 打赏
  • 举报
回复
分治法
分成两个大部分 每个部分选出一个大的
然后比较
一个是最大的 另一个是第二大的
老紫竹 2010-03-10
  • 打赏
  • 举报
回复
根据4楼整理的
class T {
public static void main(String[] args) {
System.out.println(getSecondMax(new int[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 }));
}

/**
* 求整数数组的第2大的数,不许用排序算法
*
* @param nums
* @return
*/
public static int getSecondMax(int[] all) {
int max, max2;// 第一大,第二大数字
max = all[0];
max2 = all[1];
if (max < max2) {
max = all[1];
max2 = all[0];
}
for (int i = 1; i < all.length; i++) {
if (all[i] > max2) {
if (all[i] > max) {
max2 = max;// 原来最大值变第二大
max = all[i];// 最大值更新为当前值
} else
max2 = all[i];// 当前值为第二大
}
}
return max2;
}
}
无伤 2010-03-09
  • 打赏
  • 举报
回复
更正, 是Arrays.sort(int[]), 是按 升序排列的。所以只需要 取倒数第二个数就可以了。
无伤 2010-03-09
  • 打赏
  • 举报
回复
告诉楼主个简单的办法, 你把这1000个数放到数组中, 然后调Array.sort(), 然后 去第二个数就可以了
hjh811 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 wuyu637 的回复:
o(n)一次就够了


每次保留2个值,一个最大值,一次次大值。

每次先比较次大值,大就替换,然后次大值和最大值比。
这是正解~~
musiclee 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 wuyu637 的回复:
o(n)一次就够了


每次保留2个值,一个最大值,一次次大值。

每次先比较次大值,大就替换,然后次大值和最大值比。

我承认我成惯性思维了。。。。。。。。。
bbb332 2010-03-09
  • 打赏
  • 举报
回复
引用 4 楼 redduke1202 的回复:
遍历一遍就行了

int[] all;//10000个数字
int max,max2;//第一大,第二大数字
int v;

max = max2 = all[0];
for(int i=1;i <10000;i++){
  v = all[i];
  if(v > max2){
      if(v > max){
          max2 = max;//原来最大值变第二大
          max = v;//最大值更新为当前值
      }
      else
          max2 = v;//当前值为第二大
  }
}
System.out.println("max="+max+",max2="+max2);
..
「已注销」 2010-03-09
  • 打赏
  • 举报
回复
修正下

max = all[0];
max2 = all[1];
if(max < max2){
max = all[1];
max2 = all[0];
}
for(int i=2;i<1000;i++)
....
qingyuan18 2010-03-09
  • 打赏
  • 举报
回复
晕,思维惯式了,楼上是对的
「已注销」 2010-03-09
  • 打赏
  • 举报
回复
遍历一遍就行了

int[] all;//10000个数字
int max,max2;//第一大,第二大数字
int v;

max = max2 = all[0];
for(int i=1;i<10000;i++){
v = all[i];
if(v > max2){
if(v > max){
max2 = max;//原来最大值变第二大
max = v;//最大值更新为当前值
}
else
max2 = v;//当前值为第二大
}
}
System.out.println("max="+max+",max2="+max2);
wuyu637 2010-03-09
  • 打赏
  • 举报
回复
o(n)一次就够了


每次保留2个值,一个最大值,一次次大值。

每次先比较次大值,大就替换,然后次大值和最大值比。
bawgiitx 2010-03-09
  • 打赏
  • 举报
回复
同意,就楼上的就好了
加载更多回复(1)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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