数组特点
- 数组本身是==引用数据类型==而数组中的元素可以是任何数据类型 包括基本数据类型和引用数据类型 。
- 创建数组对象会在内存中开辟==一整块连续的空间==而数组名中引用的是
这块连续空间的首地址 。 - 数组的长度一旦确定就不能修改 。
- 我们可以直接通过下标 或索引 的方式调用指定位置的元素 速度很快 。
一维数组
声明方式:
Java 语言中声明数组时不能指定其长度 数组中元素的数 例如: int a[5 ]; //非法
// type var[];
// type[] var;
int[] ids;
// 静态初始化,数组的初始化和元素的赋值操作同时进行
ids = new int[]{1,2,3,4};
// 动态初始化,数组的初始化和元素的赋值操作分开进行
String[] names = new String[5];
int[] arr = {1,2,3,4};//类型推断
数组是引用类型,它的元素 相当于类的成员变量 ,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化.
对于基本数据类型而言,默认初始化值各有不同
对于引用数据类型而言,默认初始化值为 null( 注意 与 0 不同!)
多维数组
对于二维数组的理解,我们可以看成是一维数组
array1 又作为另一个一维数组 array2 的元素而存
在。其实, 从数组底层的运行机制来看,其实没
有多维数组。
格式1:动态初始化
int[][] arr = new int [3][2];
/*
定义了名称为arr的二维数组
二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr [0], arr [1], arr [2]
给第一个一维数组1脚标位赋值为78写法是: arr[0][1] = 78
*/
格式2:动态初始化
int[][] arr = new int [3][];
/*
二维数组中有3个一维数组
每个一维数组都是默认初始化值null (注意:区别于格式 1)
可以对这个三个一维数组分别进行初始化
arr[0] = new int [3];
arr[1] = new int [1];
arr[2] = new int [2];
*/
注:
int arr = new int [][3]; //非法
格式3:静态初始化
int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
int[][] arr = {{1,2,3,4},{33,44}};//类型推断
/*
定义一个名称为arr的二维数组,二维数组中有三个一维数组
每一个一维数组中具体元素也都已初始化
第一个一维数组arr[0] = {3,8,2}
第二个一维数组arr[1] = {2,7}
第三个一维数组arr[2] = {9.0,1,6}
第三个一维数组的长度表示方式:arr[2].length
*/
- 注意特殊写法情况: int[] x,y[]; x 是一维数组, y 是二维数组。
- Java 中多维数组==不必都是规则矩阵形式==.
- 初始化方式一:外层元素存储==地址值==
- 初始化方式二:外层元素存储==null==
- arr1=arr2; 浅拷贝,指向同一个地址
排序算法
排序算法分类:内部排序和外部排序 。
内部排序 :整个排序过程不需要借助于外部存储器(如磁盘等),所有排
序操作都在内存中完成。外部排序 :参与排序的数据非常多,数据量非常大,计算机无法把整个排
序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最
常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。
各种内部排序方法性能比较
- 1.
从平均时间而言:快速排序最佳。 但在最坏情况下时间性能不如堆排序和归
并排序。 - 2.
从算法简单性看 :由于直接选择排序、直接插入排序和冒泡排序的算法比较
简单,将其认为是 简单 算法。 对于 Shell 排序、堆排序、快速排序和归并排序
算法,其算法比较复杂,认为是复杂排序。 - 3.
从稳定性看 :直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排
序、快速排序、 Shell 排序和堆排序是不稳定排序 - 4.
从待排序的记录数 n 的大小看: n 较小时,宜采用简单排序;而 n 较大时宜采
用改进排序。
排序算法的选择
- (1)
若 n 较小,如 n≤50,可采用直接插入或直接选择排序 。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直
接插入 ,应选直接选择排序为宜 。 - (2)
若文件初始状态基本有序(指正序),则应选用直接插入 、冒泡或随机的快速排序为宜 - (3)
若 n 较大,则应采用时间复杂度为 O( nlgn )的排序方法: 快速排序 、 堆排序或归并排序