求一个数组中最大的数和第二大的数至少要比较多少次?

标题求一个数组中最大的数和第二大的数至少要比较多少次?

今天本人遇到一个问题,得到一个数组中最大的数和第二大的数至少要比较多少次,我自己写了一段代码测试了一遍。
以下便是详细代码(数组是按照比较最少的次数插入的数据顺序,也就是数组第一个位置是数组中第二大的值)

public class Pianweny {
	public static void main(String[] args) {
		int[]arr= {5,6,4,3,2,1};//最少的比较次数的数组顺序(第二大的数在第一个位置)
		int a = 0;//创建变量
		int top1=0,top2=0;//创建两个int变量,用来存储第一大和第二大的数值
		boolean flog=true;//控制循环的跳出
		for (int i = 0; i < arr.length&&flog; i++) {
			for (int j = 0; j < arr.length; j++) {
				if (arr[j]>arr[i]) {
					a++;//如果arr[j]大于arr[i]则i增加1,
					top1=arr[j];
				}
			}
			//如果a==1那么跳出外层循环(说明arr[i]是第二大的值),得出第二大的值
			if (a==1) {
				top2=arr[i];
				flog=false;
			}else {
				//如果a在内层循环一次后不等于1,就说明a[i]不是第二大的数,
				//则将a初始化,方便下一次循环重新记录。
				a=0;
			}
		}
		//输出第二大的值
		System.out.println("top1:"+top1+"   "+"top2:"+top2);
	}
}

在这个数组顺序中第一个数为当前数组第二大的值。
比较顺序为:
arr[j]>arr[i]
第一次比较:arr[0]>arr[0]—>5>5,未进入循环,a的值不变化,为0。
第二次比较:arr[1]>arr[0]—>6>5,进入循环,a的值自增1,记录top1=arr[j]=arr[1],此次循环结束后a=1。
第三次比较:arr[2]>arr[0]—>4>5,未进入循环,a的值不变化,为1。
第四次比较:arr[3]>arr[0]—>3>5,未进入循环,a的值不变化,为1。
第五次比较:arr[4]>arr[0]—>2>5,未进入循环,a的值不变化,为1。
第六次比较:arr[5]>arr[0]—>1>5,未进入循环,a的值不变化,为1。
内层循环结束。
进入外层循环的if判断,判断为true,则top2=arr[i]=arr[0],然后flog改变为false。跳出外层循环。
以上得出,最少需要六次比较才能得出第一大和第二大的值,总结为数组长度为n的数组至少需要n次比较才能得出整个数组第一大和第二大的值。
希望能帮助到大家,如有补充还请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值