初始化数组
//1
int[] a = {1,2,3};
//2
int[] b = new int[10];
b[0]=1;
b[1]=2;
...
//3 默认初始化
数组特点
- 长度是确定的,一旦被创建就不可更改
- 元素必须相同
- 数组元素可以是任何类型,基本类型和引用类型
- 数组对象本身是在堆中的
二维数组
int[][] array = {{1,2},{2,3}};
System.out.println(array(0));//输出地址
print(array[0]);//调用print函数可以输出array[0]的值
public static void print(int[] arr){
for(int a:arr){
System.out.print(a+" ");
}
}
数组函数
int a = {2,1,3,34,45};
Arrays.toString(a);//[2,1,3,34,45]
Arrays.sort(a);//升序返回void
Arrays.fill(a,0);//填充,将所有值置为0,返回void
Arrays.fill(a,2,4,0);//下标2、3值填充为0
冒泡排序(升序)
- 稳定只有当两个数进行比较,后面的数比前面的小时才会交换位置,所以如果两个数相同,经过冒泡排序并不会影响之前位置
- 时间复杂度O(n^2) 空间复杂度O(1)
- 需要n-1轮,每轮都会确定一个元素的位置
步骤
- 从尾部开始比较相邻的两个元素,如果尾部的元素比前面的大,就交换两个元素的位置。
- 往前对每个相邻的元素都做这样的比较、交换操作,这样到数组头部时,第 1 个元素会成为最大的元素。
- 重复上面操作,知道没有数据为止
稀疏数组
输出原始数组:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 8 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
输出稀疏数组:
11 11 3
1 2 1
2 3 2
6 4 8
数组的常用算法
性质:稳定性,时间复杂度,空间复杂度
- 冒泡排序(交换排序)
- 稳定 O(n^2) O(1)
- 从后往前两两比较相邻元素的值,按顺序选择是否交换,直到比较完,为一趟冒泡
- 选择排序(简单选择&&堆排序)
- 不稳定 O(n^2)/O(nlog2n) O(1)
- 每次从待排序的数据中选择最小的一个
- 插入排序(直接插入&&折半插入&&希尔)
- 稳定 O(n^2) O(1)
- 选择第二数据同第一个比较,对其进行排序,再选第三个从右向左进行排序直到到达左右大小关系不同的位置,后面依次,直到最后一位
- 快速排序(交换排序)
- 不稳定 O(nlog2n) O(log2n)
- 取一个元素作为基准,两个指针low、high,用非空指针指向的数据和基准比较,如果大于基准,则指针移动,小于指针对应的数据放到空指针指向的位置,该指针移动
- 归并排序
- 稳定 O(nlog2n) O(n)
- 二路归并:将数据两个为一组,在组内进行排序,再将排好序的两组数据合并为一组,再进行排序,直到所有数据完成排序
- 希尔排序
- 不稳定 O(n^1.3) O(1)
- 对第i个同第i+n*d个数据进行直接插入排序并变化d重复操作,最后对整个序列进行一趟直接插入排序
- 基数排序
- 稳定
- 先对个位数进行排序,当个位数相同时后面的链接到前一个下面,再对数据进行按列从左到右收集,在进行前一位的排序,知道到最高位