一维数组


        一维数组
一、数组的作用和类型
1.作用
  A.存储 相同数据类型 的一组数据
  B.对同类型数据进行集中管理,比如储存和遍历
2.数组类型
  A.数组的类型就是数据中存储的数据的类型
  B.数据本身是个对象(对象属于引用数据类型)
注意:
  A.数组中的所有元素属于相同的数据类型
  B.数组中所有元素在内存中连续存储
特点:数组本身也是一种引用类型
  A.数组名只是引用,指向堆中创建的数组对象,该对象保存一组其它引用或直接值

 

 

二、声明、创建数组
1.数组的声明
  A.告诉系统数据类型是什么
  B.语法: 数据类型[] 数组名;
2.数组的创建
  A.为数组分配内存空间
    a.new操作符的使用
3.声明并创建数组
  数据类型[] 数组名 = new 数据类型[大小];
  列:int[] arry = new int[3];
4.数组的特点
  A.数组有一个字段length,表示此数组对象可以存储多个元素即数组长度;length不是实际保存的元素个数
  B.“[]”语法是访问数组对象成员的唯一方式
  C.对象数组保存的是引用,基本类型数组直接保存基本类型的值
  D.新生成的数组对象,其中所有的引用自动化初始化为null;基本类型数组成员有各自默认值(数值型自动初始化为 0,字符型为(char)0,布尔型为false,float/double型为0.0)

三、初始化数组
1.数组的初始化
  A.为数组中的成员一一赋值
2.数组赋值的两种方式
  A.边声明边赋值(静态初始化)
    int[] score = {66,77,88};
    int[] score = new int[]{66,77,88};
  B.动态地获取(从键盘录入)信息并赋值
    int[] score = new int[3];
    Scanner input = new Scanner(System.in);
    for(int i=0 ;i<3;i++){
    score[i] = input.nextInt();
    }


四、常用数组排序算法

1.冒泡排序法
  工作原理:比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对响铃元素做同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会是最大的数。针对除了最后一个元素以外所有的原色重发以上的步骤。直到没有任何一对数字需要比较。

总结:N个数,比较N-1轮,每轮比较N-1-i次。  

代码示例:

 1 package com.sanlianxueuan;
 2 
 3 public class Demo7 {
 4 
 5     /**
 6      * 冒泡排序
 7      */
 8     public static void main(String[] args) {
 9         int [] array = {1,5,3,2,6,7,9,13,54,20};
10         //N个数比较的论数N-1;
11         for (int i=0;i<array.length-1;i++){
12             //每一轮比较的次数N-1-i次;
13             for(int j=0;j<array.length-1-i;j++){
14                 //比较相邻的两个数,小的往前靠,大的往后移
15                 if(array[j]>array[j+1]){
16                     //两个数做交换,通过设置临时变量
17                     int temp = array[j];
18                     array[j] = array[j+1];
19                     array[j+1] =temp;
20                 }
21             }
22         }
23         //把排好序的数组输出
24         for(int i=0;i<array.length;i++){
25             System.out.print(array[i]+" ");
26         }
27     }
28 
29 }

2.选择排序法:
  工作原理:首先在为排序序列中找到最小元素,存放到排序序列的其实位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素觉排序完毕。

代码示例:

 1 package com.sanlianxueuan;
 2 
 3 public class Demo8 {
 4 
 5     /**
 6      * 选择排序
 7      */
 8     public static void main(String[] args) {
 9         int [] array = {1,5,3,2,6,7,9,15,54,82};
10         int min = 0;  //保存最小元素值的下标
11         //N个数进行N-1轮的比较
12         for(int i=0;i<array.length-1;i++){
13             min = i; //以第一个数为最小值
14             //查找最小数在数组中的下标
15             for(int j=i+1;j<array.length;j++){
16                 if(array[min] > array[j]){
17                     min = j;
18                 }
19             }
20             //如果第i个最小的数位置不在i上,则进行交换
21             if(i != min){
22                 int temp = array[i];
23                 array[i] = array[min];
24                 array[min] = temp;
25             }    
26          }
27         for(int i=0;i<array.length;i++){
28             System.out.print(array[i]+" ");
29         }
30     }
31 
32 }

总结:N个数,比较N-1轮

3.插入排序法:
  工作原理:它是通过构建有序序列,对于未排序数据,在已排序列中从后向前扫描,找到相应位置并插入。从后向前扫描过程中,需要反复吧已排序元素逐步向后挪位,为最新元素提供插入空间。

 代码示例:

 1 package com.sanlianxueuan;
 2 
 3 public class Demo9 {
 4 
 5     /**
 6      * 插入排序
 7      */
 8     public static void main(String[] args) {
 9         int [] array = {20,25,15,42,36,16,12};
10         for(int i=1;i<array.length;i++){
11             int temp = array[i];
12             //把下标保存起来
13             int j=i;
14             while(j>0&&temp<array[j-1]){
15                 //上面的数覆盖下面的数
16                 array[j] = array[j-1];
17                 j--;
18             }
19             array[j]=temp; //插入数据
20         }
21         for(int i=0;i<array.length;i++){
22             System.out.print(array[i]+" ");
23         }
24     }
25 
26 }

五、常用数组查找算法
1.线性查找法:
  工作原理:它又称之为顺序查找。在一列给定的值中进行搜索,从一端开始注意查询每个元素,知道返回所需元素的过程。
  例:A.查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1;
    B.求数组中的最大值,最小值

代码示例:

 1 package com.sanlianxueuan;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Demo4 {
 6 
 7     /**
 8      * 查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1;
 9      */
10     public static void main(String[] args) {
11         int[] array = {10,20,80,60,50,90,70,30};
12         Scanner input = new Scanner(System.in);
13         System.out.println("请输入一个数:");
14         int number = input.nextInt();
15         int index =-1;   //保存找到的数所在数组中的下标,找不到等于-1;
16         for(int i=0;i<array.length;i++){
17             if(number == array[i]){
18                 index = i+1;
19                 break;
20             }
21         }
22         
23         if(index != -1){
24             System.out.println("你要查找的数在第"+index+"位");
25         }else{
26             System.out.println("你要查找的数不在该数组内");
27         }
28             
29     }
30         
31 
32 }

2.二分法查找:-----针对的是有序的数据
  工作原理:它又称之为折半查找法。讲数组中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置将数组分成前、后两个子数组,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子数组,否则进一步查找后一子数组。重复以上过程知道找到或者找不到为止。

代码示例:

 1 package com.sanlianxueuan;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Demo6 {
 6 
 7     /**
 8      * 二分法查找
 9      */
10     public static void main(String[] args) {
11         int [] array ={1,2,3,4,5,6,7,8,9,18,49,87,90};
12         System.out.println("请输入要查找的数:");
13         Scanner input = new Scanner(System.in);
14         int number = input.nextInt();
15         int index = -1;   //保存找到数所在数组中的下标,找不到等于-1
16         int start = 0;   //起始下标
17         int end = array.length-1;  //终止下标
18         int middle;
19         while(start<end){
20             //找到中间下标所对应的元素值
21             middle = (start+end)/2;
22             if(number == array[middle]){
23                 index = middle+1;
24                 break;
25             }
26             //假如要查找的那个数大于中间比较的那个数
27             //去掉左边的数
28             if(number > array[middle]){
29                 start = middle+1;
30                 
31             }
32             //保留左边的数,去掉右边的数
33             if(number < array[middle]){
34                 end = middle - 1;
35                 
36             }
37         }
38         if(index != -1){
39             System.out.println("要找的数在"+index+"位");
40         }
41         
42         if(index == -1){
43             System.out.println("not find");
44         }
45 
46     }
47 
48 }

六、Arrays类使用
java的jdk中提供了一个Arrays工具类,此类专门为程序员操作数组提供了很多专有的方法,通过方法的调用可以对数组进行复制、排序、比较、查找元素等功能。

 代码示例:

 1 package com.sanlianxueuan;
 2 
 3 import java.util.Arrays;
 4 
 5 public class Demo10 {
 6 
 7     /**
 8      * Array类的引用
 9      */
10     public static void main(String[] args) {
11         int [] arraySrc1 = {1,3,4,5,6,2};
12         //拷贝数组
13         //参数说明:第一个是要拷贝的数组名,第二个是数组的长度
14         int [] arrayDes1 = Arrays.copyOf(arraySrc1, 10);
15         for(int i=0; i<arrayDes1.length;i++){
16             System.out.print(arrayDes1[i]+" ");
17         }
18         
19         System.out.println("
*******************");
20         //拷贝指定数组中的指定范围内的数据
21         //参数说明:第一个是要拷贝的数组,第二个是要拷贝的起始位置下标,第三个是拷贝结束的数组下标
22 /*        注意:数组的长度是第三个参数-第二个参数*/
23         int [] arrayDes2 = Arrays.copyOfRange(arraySrc1, 2, 4);
24         for(int i=0; i<arrayDes2.length;i++){
25             System.out.print(arrayDes2[i]+" ");
26         }
27         //数组的比较
28         System.out.println("
*******************");
29         int [] arraySrc2 = {1,3,5,6,2};
30         boolean flag = Arrays.equals(arraySrc1, arraySrc2);
31         System.out.println(flag);
32         
33         //数组的填充
34         System.out.println("
*******************");
35         int [] arrayDes3 = new int[10];
36         //Arrays.fiil(arrayDes3,10);
37         //参数说明:第一个参数是要填充的数组,第二个是要填充的起始位置,
38         //第三个是要填充的终止位置,第四个是要填充的数
39         Arrays.fill(arrayDes3,1,5, 10);
40         for(int i=0; i<arrayDes3.length;i++){
41             System.out.print(arrayDes3[i]+" ");
42         }
43         
44         //对数组进行排序
45         System.out.println("
*******************");
46         Arrays.sort(arraySrc1);
47         for(int i=0; i<arraySrc1.length;i++){
48             System.out.print(arraySrc1[i]+" ");
49         }
50         
51         //二分法查找
52         System.out.println("
*******************");
53         int index = Arrays.binarySearch(arraySrc1, 5);
54         System.out.println(index);
55         
56         //使用System这个类的方法来拷贝数组
57         System.out.println("
*******************");
58         int [] arrayDes5 = new int [10];
59         System.arraycopy(arraySrc1, 0, arrayDes5, 2, 5);
60         for(int i=0; i<arrayDes5.length;i++){
61             System.out.print(arrayDes5[i]+" ");
62         }
63     }
64 
65 }
原文地址:https://www.cnblogs.com/lixiaokang-blog/p/7276012.html