数组和算法

 

1.1.1     数组的概念

数组(Array)是相同类型数据的有序结合。

 

数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来(index)访问它们.

 

数组的三个特点:

--其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

--其元素必须是相同类型,不允许出现混合类型。

--数组中的元素可以是任何数据类型,包括基本类型和引用类型。

--位置有顺序

 

1.1.2内存空间分类:

内存分为两类:

栈(stack)内存:基本数据类型分配在栈内存,栈内存空间不需要开发者回收,系统会自动回收。栈空间占整个内存空间的比例较小。

 

堆(heap)内存:引用数据类型分配在堆内存,堆内存一定要开发者通过new 来申请,开发者申请的内存使用完成后一定要回收。jvm中有专门的垃圾回收机制(gc)回收使用完的堆内存。堆空间占整个内存空间的比例较大。

 

1.2数组的声明

数组的声明有两种方式:

数据类型[] 变量  à推荐写法

 

数据类型 变量[]

 

创建数组:

public class Test03{

public static void main(String[] args){

         //声明数组变量

         int[] a;

         //给数组变量分配空间;

         //给a申请了5个连续整型的int空间。

         a = new int[5];

         //给每个空间赋值

         a[0] = 10;

         a[1] = 20;

         a[2] = 30;

         a[3] = 40;

         a[4] = 50;

         //访问元素

         System.out.println(a[0]);

         System.out.println(a[1]);

}

}

输出结果为:

 

 

1.2.1数组的内存空间

 

 

1.2.2 数组声明的其他方式

标准的声明和赋值方法过于复杂,可以使用简写的方式

数据类型[] arr = new int[]{值1,值2,…}

jvm根据后面值的个数申请空间并把值赋值到对于空间。

 

public class Test04{

         public static void main(String[] args){

                  //【1】数组声明方式

                  int[] arr = new int[5];

                  arr[0] = 10;

                  arr[1] = 20;

                  arr[2] = 30;

                  System.out.println(arr);

                  System.out.println(arr[2]);

                  //【2】值声明

                  int[] arr1 = new int[]{10,20,30,40,50};

                  System.out.println(arr1);

                  System.out.println(arr1[2]);

                  //【3】数组的字面量声明

                  int[] arr2 ={10,20,30,40,50};

                 

                  //字面量声明不支持分开赋值

                  /*

                  int[] arr2;

                  arr2 = {10,20,30,40,50};

                  */

                  System.out.println(arr2);

                  System.out.println(arr2[2]);

         }

}

这三种方式返回的结果都是一样的:

 

 

1.2.3 数组的遍历

public class Test05{

         public static void main(String[] args){

                  int[] arr = {10,20,30,40,50};

                  for (int i=0;i<arr.length;i++){

                          System.out.println("arr["+i+"]"+"="+arr[i]);

                  }

         }

}

返回的值为:

 

 

拓展练习:

从控制台输入5位学生的成绩,请求平均分。

需求分析:

【1】从控制台输入需要调用Scanner;

【2】5位学生的成绩未知,需要先预留空间,等控制台赋值;

【3】需要先求和,才可以求平均分

import java.util.Scanner;

 

public class Test05{

         public static void main(String[] args){

        

                 

                  //从控制台输入5个学生的成绩,并求平均分。

                  float[] arr = new float[5];

                  Scanner input = new Scanner(System.in);

                  float sum = 0.0f;

                  for (int i=0;i<arr.length;i++){

                          System.out.println("请输入第"+(i+1)+"位学生的成绩:");

                          arr[i] = input.nextFloat();

                          sum += arr[i];

                  }

                  float avg = sum / arr.length;

                  System.out.println("平均分为"+avg);

                                  

         }

}

返回结果为:

 

 

如何生成26个大写英文字母?

public class Test06{

         public static void main(String[] args){

                  char[] arr = new char[26];

                  for (int i=0;i<26;i++){

                          arr[i] =(char)('A'+i);

                          System.out.print(arr[i]+"\t");

                  }

         }

}

返回结果为:

 

 

有一个数列:8,4,2,1,23,344,12

--循环输出数列的值

--求数列中所有数值的和

--猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含次数

import java.util.Scanner;

public class Test07{

         public static void main(String[] args){

                  int[] arr = {8,4,2,1,23,344,12};

                  int sum = 0;

                  for (int i=0;i<arr.length;i++){

                          System.out.println(arr[i]);

                          sum += arr[i];                  

                  }

                  System.out.println("sum ="+sum);

                  System.out.println("请输入一个数字:");

                  Scanner sc = new Scanner(System.in);

                  int j = sc.nextInt();

                  int i=0;

                  for (;i<arr.length;i++){

                          if (j == arr[i]){

                                  

                                   break;

                          }

                  }

                  if (i >= arr.length){

                          System.out.println(j+"不存在");

                  }else {

                          System.out.println(j+"存在");

                  }

         }

}

返回结果如下:

 

 

1.3数组的常用算法

1.3.1插入算法

一个数组有序,添加一个元素后,数组依然有序

public class Test08{

         public static void main(String[] args){

                  int[] arr = {1,3,5,7,9,11,0};

                  int t = 8;

                  //【1】找位置

                  int loc = -1; //表示应该添加到的位置

                  for(int i=0;i<arr.length-1;i++){

                          if(arr[i] >= t){

                                   loc = i;

                                   break;

                          }

                  }

                  System.out.println("loc="+loc);

                  if(loc<0){ //没找到合适位置

                          arr[arr.length-1] = t;

                  }else{

                          //【2】依次后移

                          for(int j=arr.length-1;j>loc;j--){

                                   arr[j] = arr[j-1];

                          }

                          //【3】添加插入的值

                          arr[loc] = t;

                  }

                  //验证

                  for(int i=0;i<arr.length;i++){

                          System.out.print(arr[i]+"\t");

                  }

         }

}

返回结果如下:

 

 

1.3.2 删除算法

一个数组有序,删除一个元素后,数组依然有序

public class Test09{

         public static void main(String[] args){

                  int[] arr = {1,3,5,7,9,11};

                  int t = 7;

                  //【1】找位置

                  int loc = -1;

                  for(int i=0;i<arr.length;i++){

                          if(t == arr[i]){

                                   loc = i;

                                   break;

                          }

                  }

                  //【2】移动元素

                  if(loc < 0){

                          System.out.println(t+"在数组中不存在");

                  }else{

                          for(int j = loc;j<arr.length-1;j++)

                                   arr[j] = arr[j+1];

                  }

                  //[3]最后一个元素置0

                  arr[arr.length-1] = 0;

                 

                  //验证

                  for(int i=0;i<arr.length;i++){

                          System.out.print(arr[i]+"\t");

                         

                  }

         }

}

返回结果为:

 

 

1.3.3冒泡排序算法

请将一组无序数组进行有序排序

分析图示例:

 

代码示例:

public class Test10{

         public static void main(String[] args){

                  int[] arr = {5,3,4,2,1};             

                  int a = 0;

                  for(int i =0;i<arr.length-1;i++){                        

                          for(int j=0;j<arr.length-1-i;j++){

                                   if(arr[j]>arr[j+1]){

                                            a = arr[j];

                                            arr[j] = arr[j+1];

                                            arr[j+1] = a;

                                   }

                          }

                  }

                  for(int i=0;i<arr.length;i++){

                          System.out.print(arr[i]+"\t");

                  }

         }

}

返回结果如下:

 
posted @ 2019-04-25 21:32  SeanGuo  阅读(333)  评论(0编辑  收藏  举报