Java基础——Java的基本语法(数组、排序)
Java基础知识图解
数组
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
- 数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
一维数组声明
一维数组初始化
内存结构
内存的基本结构:
数组声明与赋值:
多维数组
二位数组的声明与赋值内存结构
数组常用的算法
1.求数组元素的最大值、最小值、平均数、总和等
2.数组的复制、反转
数组复制
int [] arr1 = new int[arr.length];
for (int i = 0; i<arr.length;i++){
arr1[i] = arr[i];
}
数组复制的错误形式:
arr1 = arr;
解释:只是改了地址指向,相当于粘贴修改arr时arr1也会改变。
反转的两种方式
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
for (int x = 0, y = arr.length-1; x < y; x++, y--){
int temp = arr[i];
arr[x] = arr[y];
arr[y] = temp;
}
解析图:
3.数组元素的排序
数组排序
插入排序
直接插入排序、折半插入排序、Shell排序
交换排序
冒泡排序、快速排序(或分区交换排序)
选择排序
简单选择排序、堆排序
归并排序
基数排序
排序方法的选择
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
空间复杂度与时间复杂度:
空间复杂度指的是排序需要的占用的空间。
时间复杂度指的是排序需要使用的时间。
冒泡排序
排序思想:
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。
int[] arr = {1, 4, 3, 2, 5};
// 数组长度为5需要遍历4次
for (int i = 0; i < arr.length - 1; i++) {
// 数组长度为5需要比较4次,每次比较都会排出一个最大值在最后,所以-i
for (int j = 0; j < arr.length - 1 - i; j++) {
// 前一个后一个比较如果符合条件,交换位置
if (arr[j] > arr[j + 1]) {
int small = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = small;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
直接选择排序
排序思想:将待排序的元素分为已排序(初始为空)和未排序两组,依次将未排序的元素中值最小的元素放入已排序的组中。
直接选择排序简单直观,但性能略差;堆排序是一种较为高效的选择排序方法,但实现起来略微复杂
int[] arr = {1, 4, 3, 2, 5};
// 数组长度为5需要遍历4次
for (int i = 0; i < arr.length - 1; i++) {
// 初始化t
int t = i;
// j=i 每一次循环就会选出一个最小的,那么就可以从第二个开始就是i
// 选择出一个arr[t]与数组比较(并不是数组的arr[t],是取出来的),需要比较5次故不length-1
for (int j = i; j < arr.length; j++) {
// 如果当前t与每一个比较,得出最小的index
if (arr[t] > arr[j]) {
t = j;
}
}
// 如果t改变交换位置,如果没有该别t最小
if (t != i) {
int max = arr[t];
arr[t] = arr[i];
arr[i] = max;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}