zoukankan      html  css  js  c++  java
  • 数组中涉及的常见算法

    数组中涉及的常见算法:

    • 数组元素的赋值
    • 求数值型数组中元素的最大值,最小值,平均数,总和等
    • 数组的复制,反转,查找(线性查找,二分法查找)
    • 数组的排序

    练习题总结:

    第一类问题:创建一个长度为6的int型数组,要求取值1-30,随机赋值,同时要求元素的值各不相同
    
     1 public class ArrayExer {
     2     public static void main(String[] args) {
     3         int[] array=new int[6];
     4         for(int i=0;i<array.length;i++) {
     5             array[i]=(int) (Math.random() * 30)+1;//因为random是左闭右开式,所以得加一
     6             for(int j=0;j<i;j++) {
     7                 if(array[i]==array[j]) {
     8                     i--;
     9                     break;
    10                 }
    11             }
    12         }
    13         for(int i=0;i<array.length;i++) {
    14             System.out.println(array[i]);
    15         }
    16     }
    17 
    18 }
    
    

    理解:array[j]代表的是已生成的array[i];一旦有相等的值,就i--重新生成新的值;

    第二类问题:创建一个int型的一维数组,包含10个元素,随机赋值,然后求取所有元素的最大值,最小值,平均数,总和等;要求:所有随机数都是两位数
     1 public class ArrayExer2 {
     2     public static void main(String[] args) {
     3         int[] arr = new int[10];
     4         int Max = 0;
     5         int Avg = 0;
     6         int Sum = 0;
     7         for (int i = 0; i < arr.length; i++) {
     8             arr[i] = (int) (Math.random() * 99) + 1;
     9             System.out.println("第" + i + "个数是:" + arr[i]);
    10             // 求总和
    11             Sum += arr[i];
    12             // 求平均值
    13             Avg = Sum / 10;
    14             // 求最大值
    15             if (Max < arr[i]) {
    16                 Max = arr[i];
    17             }
    18         }
    19         // 求最小值
    20         int Min = arr[1];
    21         for (int i = 0; i < arr.length; i++) {
    22             if (Min > arr[i]) {
    23                 Min = arr[i];
    24             }
    25         }
    26         System.out.println("这十个数中的最大值是:" + Max);
    27         System.out.println("这十个数中的最小值是:" + Min);
    28         System.out.println("这十个数平均数是:" + Avg);
    29         System.out.println("这十个数总和是:" + Sum);
    30     }
    31 }
    
    

     运行结果:

     第三类问题之其一:数组的复制。

    • 创建一个名为ArraExer3的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组,
    • 使用{},把array1初始化为八个素数:2,3,5,7,11,13,17,19;
    • 显示array1的内容
    • 赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0;array[2]=2;)打印出array1;
     1 public class ArrayExer3 {
     2 public static void main(String[] args) {
     3     int[] array1=new int[] {2,3,5,7,11,13,17,19};
     4     //遍历array1[]
     5     for(int i=0;i<array1.length;i++) {
     6         System.out.print(array1[i]+" ");
     7     }
     8     int[] array2=array1;//这个操作不能成为数组的复制
     9     //修改array2中的偶索引元素
    10     for(int i=0;i<array1.length;i++) {
    11         if(i%2==0) {
    12             array2[i]=i;
    13         }
    14         System.out.println();
    15         System.out.print("修改后的array1为:"+array1[i]+" ");
    16     }
    17     System.out.println();
    18     System.out.println(array1);
    19     System.out.print(array2);
    20 }
    21 }

    运行结果:

    此时,内存存储情况如下图所示:

    理解:通过此例,说明第八行的操作并不是复制,而是类似于Windows的创建快捷键。

    array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。内存中只有出现new才在堆中开辟新的内存空间。

     改正之后:

    • 创建一个名为ArraExer3的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数
    • 使用{},把array1初始化为八个素数:2,3,5,7,11,13,17,19;
    • 显示array1的内容
    • 实现array2对array1的复制,修改array2中的偶索引元素,使其等于索引值(如array[0]=0;array[2]=2;)打印出array1;
     1 public class ArrayExer3 {
     2 public static void main(String[] args) {
     3     int[] array1=new int[] {2,3,5,7,11,13,17,19};
     4     //遍历array1[]
     5     for(int i=0;i<array1.length;i++) {
     6         System.out.print(array1[i]+" ");
     7     }
     8     //数组的复制
     9     int[] array2=new int[8];
    10     for(int i=0;i<array2.length;i++) {
    11         array2[i]=array1[i];
    12     }
    13     //修改array2中的偶索引元素
    14     for(int i=0;i<array1.length;i++) {
    15         if(i%2==0) {
    16             array2[i]=i;
    17         }
    18         System.out.println();
    19         System.out.print("修改后的array2为:"+array2[i]+"         ");
    20         System.out.print("修改后的array1为:"+array1[i]+" ");
    21     }
    22     System.out.println();
    23     System.out.println(array1);
    24     System.out.print(array2);
    25 }
    26 }

    运行结果:

    此时,内存存储情况变为  如下图所示:

     第三类问题之其二:数组的反转。

    public class ArrayExer5 {
        public static void main(String[] args) {
            String[] arr = new String[] { "WW", "ZZ", "YY", "MM", "DD", "SS", "XX" };
            // 数组的反转
            for (int i = 0; i < arr.length / 2; i++) {
                String temp = arr[i];
                arr[i] = arr[arr.length - 1 - i];
                arr[arr.length - 1 - i] = temp;
            }
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "  ");
    
            }
        }
    }

    运行结果:

     第三类问题之其三:数组的查找———线性查找

       

     1 public class ArrayExer5 {
     2     public static void main(String[] args) {
     3         String[] arr = new String[] { "WW", "ZZ", "YY", "MM", "DD", "SS", "XX" };
     4         // 数组的查找
     5         String dest = "YY";
     6 
     7         boolean isflag = true;
     8         for (int i = 0; i < arr.length; i++) {
     9             if (dest == arr[i]) {
    10                 System.out.println("找到了指定的元素:" + "位置在" + i);
    11                 isflag = false;
    12                 break;
    13             }
    14 
    15         }
    16         if (isflag) {
    17             System.out.println("很遗憾,没有找到您要的数据!");
    18         }
    19     }
    20 }

    运行结果:

     第三类问题之其三:数组的查找———二分法查找

    前提:所要查找的数组必須有序;

     1 public class ArrayExer6 {
     2 public static void main(String[] args) {
     3     int[] arr=new int[] {-23,34,61,94,134,165};
     4     int dest=34;
     5     //初始的首索引
     6     int head=0;
     7     //初始的末索引
     8     int end=arr.length-1;
     9     boolean isFlag = true;
    10     while(head<=end) {
    11         int middle=(head+end)/2;
    12         if(dest==arr[middle]) {
    13             System.out.println("找到了指定的元素:" + "位置在" + middle);
    14             isFlag=false;
    15             break;
    16             }else if(dest<arr[middle]) {
    17                 end=middle-1;
    18             }else {
    19                 head=middle+1;
    20             }
    21     }
    22     if(isFlag) {
    23         System.out.println("很遗憾,没有找到您要的数据!");
    24         
    25     }
    26 }
    27 }

     第四类问题:数组的排序之冒泡排序

     1 public class Bubblesort {
     2 public static void main(String[] args) {
     3     int[] arr=new int[] {-12,45,62,72,19,-12,95,39};
     4     //冒泡排序 升序排列
     5     for(int i=0;i<arr.length;i++) {
     6         for(int j=0;j<arr.length-1-i;j++) {
     7             if(arr[j]>arr[j+1]) {//改成小于就是降序排列
     8                 int temp=arr[j];
     9                 arr[j]=arr[j+1];
    10                 arr[j+1]=temp;
    11             }
    12         }
    13     }
    14     for(int i=0;i<arr.length;i++) {
    15         System.out.print(arr[i]+"   ");
    16     }
    17 }
    18 }

    运行结果:

     

    八种排序的比较:

     

     
  • 相关阅读:
    在Eclipse中运行JAVA代码远程操作HBase的示例
    hbase基本概念和hbase shell常用命令用法
    如何使用putty远程连接linux
    如何在Eclipse下安装SVN插件——subclipse
    solr之创建core(搜索核心,包括索引和数据)的方法
    百度地图api基本用法
    四年大学不如选择培训一年?
    树常见的算法操作
    二叉树常见遍历算法
    Java多线程实现生产者消费者延伸问题
  • 原文地址:https://www.cnblogs.com/boogie-xy/p/11307807.html
Copyright © 2011-2022 走看看