Java系列课程第五天(数组遍历、排序、二分法)

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. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  5. 在这里插入图片描述
    1.12.3 选择排序
    选择排序(Selection Sort)是一种简单直观的排序算法。它每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
    【算法思想】
  6. 在未排序序列中找到最小元素,存放到排序序列的起始位置
  7. 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。
  8. 以此类推,直到所有元素均排序完毕。
  9. 在这里插入图片描述
    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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值