数组中我们得到的一般都是一个无序的数组,那我们找最大值最小值或者第二大的值第二小的值,或者一些别的要求的值就非常麻烦。但是如果我们能把数组重新排序一下,从大到小或者从小到大,这样找起来就非常方便了。 package com.itheima; import java.util.Random; public class maopaofa { public static void main(String[] args) { //利用冒泡法找数组中第二大和第二小的数的值 //创建一个长度为10的int数组 int[] arr =new int[10]; //用Random产生1-100的随机数并用for循环给arr数组的每个元素赋值 Random r =new Random(); for (int i=0;i<10;i++) { arr=r.nextInt(100)+1; } //遍历生成新数组 for(int a:arr) { System.out.print(a+"\t"); } //起泡排序 int temp=0; //外层循环n-1次, for (int i=0; i<arr.length-1;i++) { //内层循环n-1-i,因为内循环完成第一次之后,把最大的一个数换到//了最后一个,第二次内循环是把第二大的数换到倒数第二个,所以内//循环的次数要减1。以此推论,后面每次内循环的循环次数就是前一//次内循环的次数减1,也就是减i. for(int j=0; j<arr.length-1-i;j++) { //如果前面大,就换到后面.循环外定义一个变量temp.如果前面//arr[j]大,把前面的值arr[j]赋值给temp.然后把后面的值赋值//arr[j+1]给前面arr[j],这样前面的值arr[j]被覆盖,变成了//后面的值。再把temp的值赋值给后面的arr[j+1]面,这样前后//两个的值发生互换,也就是把大的数换到了后面,小的数放到了前//面. if (arr[j]> arr[j+1]) { temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } System.out.println("\r\n-----------------"); //再次遍历排序后的数组,可以看到是一个从小到大排列的数组 for(int a:arr) { System.out.print(a+"\t"); } System.out.println("\r\n-----------------"); //升序排序之后,再来求第二大和第二小的数。最大的数也就是排序后数组中最后一个数。 //最小的数就是数组中第一个数.分别赋值给secMax和secMin int secMin=arr[0]; int secMax=arr[arr.length-1]; // 遍历数组,找到第一个大于secMin也就是arr[0]的数,就是第二小的数了,赋值给secMin。 //结束循环。那第二小的数就是secMin了。 for(int i=0;i<arr.length;i++){ if (arr>secMin){ secMin=arr; break; } } //反向遍历数组。找到第一个小于secMax也就是arr[arr.length-1]的数。就是第二大的数了。 //结束循环。那第二小的数就是secMax了。 for(int i=arr.length-2;i>=0;i--){ if (arr<secMax){ secMax=arr; break; } } //分别输出第二大和第二小的数。 System.out.println("数组中的第二大的数字为:"+secMax); System.out.println("数组中的第二小的数字为:"+secMin); } } 最后测试一下看对不对。运行程序 排序前的数组是 98 10 8 37 58 19 31 6 21 37 ----------------- 排序后的数组是 6 8 10 19 21 31 37 37 58 98 ----------------- 数组中的第二大的数字为:58 数组中的第二小的数字为:8 再来测试一下 排序前的数组是 50 85 15 41 30 51 95 58 35 58 ----------------- 排序后的数组是 15 30 35 41 50 51 58 58 85 95 ----------------- 数组中的第二大的数字为:85 数组中的第二小的数字为:30 测试正确,没有问题。
|