A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 末日雨下 初级黑马   /  2018-4-8 08:36  /  1213 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数组中我们得到的一般都是一个无序的数组,那我们找最大值最小值或者第二大的值第二小的值,或者一些别的要求的值就非常麻烦。但是如果我们能把数组重新排序一下,从大到小或者从小到大,这样找起来就非常方便了。
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
测试正确,没有问题。

2 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马