数组
数组概述
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括 基本数据类型和引用数据类型。
创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是 这块连续空间的首地址。
数组的长度一旦确定,就不能修改。
我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
数组的分类:按照维度:一维数组、二维数组、三维数组、…
按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组
一维数组
int a[]; int[] a1; double b[]; String[] c;
初始化:
int[] arr = new int[3];
String names[]; names = new String[3];
int arr[] = new int[]{ 3, 9, 8}; 或 int[] arr = {3,9,8};
String names[] = { “李四光”,“茅以升”,“华罗庚” }
小结:
数组与字符串类型均为引用数据类型,数组中的元素可以是任意数据
定义并使用new为之分配空间,才可以引用数组中的元素
String [] c;为引用类型变量数组
二维数组
动态:int[][] arr = new int[3][2];
int[][] arr = new int[3][];这种定义每一个数组都是默认初始化值null(区别上一种)
不可以定义为int[][] arr = new int[][3];
静态:int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}}
注意:
int[] x,y[];x是一维数组,y是二维数组。
java中多维数组不必都是规则矩阵形式。
数组 中变量的复制只是地址的复制,并不是数组值的复制 如:array2 = array1,改变array2中的值array1也会变化。
随机数的定义
Math.random()返回一个0到1之间的double值;
【10.99】为(int)(Math.random() * (99-10+1) + 10)
算法
算法的优劣:分析关键字的比较次数和记录的移动次数
时间复杂度:分析排序算法中需要多少辅助内存
稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保 持不变,则称这种排序算法是稳定的。
算法的五大特征:
输入,输出,有穷性,确定性,可行性。
冒泡排序
-
比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。
快速排序
-
从数列中挑出一个元素,称为"基准"(pivot),
-
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
-
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
快速排序时间为最少。
数组的工具
boolean equals(int[] a,int[] b) 判断两个数组是否相等。
String toString(int[] a) 输出数组信息。
void fill(int[] a,int val) 将指定值填充到数组之中。
void sort(int[] a) 对数组进行排序。
int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。
void copyOf(int[] a,key)
使用方法 :Arrays.工具。
异常:数组脚标越界异常(ArrayIndexOutOfBoundsException)
空指针异常(NullPointerException)
稀疏数组
一个数组中大部分值为0时,为了节省空间,采用稀疏数组
稀疏数组通常三列 分为行 ,列 ,值