数组概念
-
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。数组既可以存储基本数据类型,也可以存储引用数据类型。
什么是数组的初始化
什么是数组的初始化 -
数组初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。初始化的分类:
a:动态初始化: 只指定长度,由系统给出初始化值
b:静态初始化: 给出初始化值,由系统决定长度
//动态初始化:
int[] arr = new int[5];
int arr[] = new int[5];
//静态初始化:
int[] arr = new int[]{1,2,3,4};
int arr[]={1,2,3,4}; //简写
int[] g,z[]; //代表定义了两个数组,一个一维数组g一个二维数组z
g=new int[1];
z=new int[2][2];
数组的常见排序算法
- 排序:把一个无序序列通过某种方式变成一个有序序列
1.冒泡排序 - 通过第一轮比较,将最大或最小的值交换到数组最后的位置
- 然后层层比较使得数组有序
2.选择排序 - 由第一个数开始,与数组后面的数逐一比较,后小则交换位置,一轮结束最小数交换到最前面,多轮交换后数组有序
3.插入排序 - 从1索引开始,将后面数据循环插入之前有序数组中,插入数据后数组仍然有序
4.希尔排序(缩小增量排序) - 是对插入排序的一个优化,核心的思想就是合理的选取增量,经过一轮排序后,就会让序列大致有序
- 然后再不断的缩小增量,进行插入排序,直到增量为1那整个排序结束(直接插入排序,其实就是增量为1的希尔排序)
- 合理的选取这个增量,可以第一次增量选取数组长度的一半,然后不断的减半,但这样不是很好,可以使用克努特序列:
//克努特序列 :
int h=1;
h=h*3+1; //1,4,13,40,121,364
5.快速排序
- 分治法:比大小,再分区
1.从数组中取出一个数,作为基准数。
2.分区:将比这个数大或等于的数全放到他的右边,小于他的数全放到他的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
6.归并排序 - 就是利用归并的思想实现排序的方法。原理是假设初始序列有N个记录,则可以看成是N个有序的子序列,每个子序列的长度为1,然后两两归并,得到N/2个长度为2或1的有序子序列,再两两归并…如此重复,直至得到一个长度为N的有序序列为止,这种排序方法称为二路归并排序。如图示:
7.基数排序(桶排序)
基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配"与“收集"两种操作即可完成。
8.堆排序 - 基本思想 :
1.将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。
⒉将其与末尾元素进行交换,此时末尾就为最大值。
3.然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。
4.如此反复执行,便能得到一个有序序列了。