Day05 数组遍历、排序、二分法
1. 数组
1.1 概述
基于底层的数据结构,任何语言都有
用于存储多个数据
数组可以看成是多个相同类型数据的组合,实现对这些数据的统一管理
数组中的每一个数据 — 数组的一个元素(element)
数组中的元素可以是任何数据类型,包括基本数据类型和引用类型
数组中元素的个数,称为数组的长度(length)
Java语言中声明数组时不能指定其长度
e.g. int a[5]; //非法
1java中的数组
可以看做多个相同数据类型的存储容器
有序,可重复
线性,空间是连续的
内置对象,保存在堆内存,占用两块空间(栈内存变量指向堆内存对象)
2Arrays类
java.util.Arrays类是java提供用于操作数据的工具类3引用类型
数组,类,接口
意味着数组保存的是地址
4 length数组对象中有一个默认的length属性,保存当前数组的长度数组长度一旦确定,不能更改
意味着数组不能删除数据,想要删除数据,必须重新创建数组空间然后把原空间中的内容依次复制过去,在复制过程中,可以进行删除操作(不复制它即可)
5索引
数组采用第一个元素的地址,作为整个数组的地址,通过偏移量,可以找到其他元素通过内存地址直接查询,所以查询效率极高
并且每一个元素空间,都有一个独一无二的编号而第一个元素用0表示以此类推,最后一个元素索引就是个数-14
特性:
查询更改快,添加删除慢下标从0开始
与之相对应的还有一种数据结构是链表
1.2 数据结构
是计算机存储、组织数据的一种方式
通常选择合适的数据结构 可以带来更高的执行/存储效率
1.3 数组声明
1.3.1 静态声明
1静态声明:在知道数组中每一个元素的值的情况下,使用静态声明:数据类型[0变量={值,值,值….多个值用逗号隔开
int i=1;
int-维数组,里面存储int值
int[]is ={1,2,3,4);
int 二维数组,里面存储int]值
int[O[0 iss ={{1,2,3,4},{1,2,3,4},{1,2,3,4}
int[][00 isss={{{1,2},{3},{{2}{1}}
boolean[]bs={false,false,true};
[]可以放到变量后面,也可以放到数据类型后面
int[] a;和int a[]一样
1.3.2 动态声明
2动态声明:预先不知道保存具体值的情况下使用动态声明,但是需要指定长度(你可以不知道每一个元素的值,但是你得知道有多少元素)
数据类型变量名=new 数据类型[长度];
int[] as=new int[10];动态声明一个int一维数组,并且里面可以有10个int值
int[] ass=new int[10][2];动态声明一个int二维数组,里面有10个一维数组,并且每个一维数组中都有2个int值
booleanJ bs=new boolean[2];比如创建的是int一维数组,有10个元素,则会用对应的默认值占位(也就是现在数组中有10个0)
int[] is=new int[10]:10个0
boolean[] bs=new boolean[4]:
4个false整数型:0
浮点型:0.0
字符型:\u0000
作尔型:talse
引用类型:null
1.4 数组操作
1.4.1 获取/访问
1.4.2 设置/更改
1.4.3 遍历
1.5 常见异常
1.6 数组声明第三种方式
语法 : 数据类型[ ] 变量 = new 数据类型[]{值,值,值…};
1.7 Main方法传参
1.8 传值和传引用
传值和传引用:
传值:指的是基本类型的传递
两个值互不相关
传引用:指的是引用类型的传递
一个改动都改动(因为都是找到数据的地址)
1.9 数组复制
1.10 二维数组
1.10.1 概述
二维数组:可以模拟平面数据结构(表)
静态语法:数据类型[]变量={{值,值…}.{值,值.…}.{值,值………};
int,int],int[][]是不同的数据类型
1.10.2 存储方式
1.10.3 静态声明
1.10.4 动态声明
1.10.5 二维数组遍历
嵌套循环
三维数组,三个嵌套循环
先把多维数组,通过单个循环遍历,得到一维数组
再遍历一维数组
1.11 Scanner
接收控制用户输入
使用一个类,必须要先找到这个类,通过包名.类名 才可以找到
1.12 排序算法
通过代码使数组中元素的大小排列有序,有规律
1.12.1 交互变量的值
1.12.2 冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢 “浮”到数列的顶端,故名 “冒泡”。
【算法原理】
冒泡排序算法的运作如下:(从后往前)
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.12.3 选择排序
选择排序(Selection Sort)是一种简单直观的排序算法。它每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
【算法思想】- 在未排序序列中找到最小元素,存放到排序序列的起始位置
- 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。
- 以此类推,直到所有元素均排序完毕。
1.12.5 API排序
1.12.6 字符串排序
1.13 二分法查找
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
【算法原理】
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
【算法要求】
1)必须采用顺序存储结构。
2)必须按关键字大小有序排列。
实现代码如下:
public static int search(int[] a, int num){
int count = 0;
// 起始索引
int startPos = 0;
// 结束索引
int endPos = a.length-1;
// 中间索引
int m = (startPos+endPos) / 2;
// 起始索引 > 结束索引终止
while(startPos <= endPos){
count++;
// 相等
if (num == a[m]) {
System.out.println("执行了 : "+count);
return m;
}else if (num > a[m]) {
// 目标数据大 , 则查询后半截,结束值不变,起始值为中间值+1
startPos = m+1;
}else{
// 目标数据小,则查询前面,起始值不变,结束值变为中间值-1
endPos = m-1;
}
// 重新生成中间值
m = (startPos+endPos) / 2;
}
System.out.println("执行了 : "+count);
// 到这里 说明没有执行上面的return,就意味着,找完了,没找到
return -1;
}