课时14 数组与方法操作(重点)
数组是一个引用数据类型,我们知道任何一个引用数据类型都可以为其设置多个栈内存内存指向。所以在进行数组操作的时候,也可以将其通过方法进行处理(什么意思呢如下)。
-
使用方法接收数组。
图片.png

以上就是在主类中进行定义,然后再主方法中进行调用。
方法返回值是一个数组的语法
public static int[] 方法名(){
return new int [] {1,2,3}
方法可以接受数组 => 发生数组的引用传递 => 根据传递过来的引用可以对数组进行修改。
}

在方法执行完毕后。

课时15 Java对数组的支持
在Java本身给出的类库之中也有提供对于数组操作的相关方法。
- 数组排序 : java.util.Arrays.sort(数组名称);
- 只要是基本数据类型的数组,Arrays.sort()可以进行轻松排序。
- 排序默认都是升序
- 数组拷贝
- 含义就是将一个数组的部分内容,替换为另一个数组的部分内容。js的splice就是数组拷贝。
课时16 数组数据统计(就是讲所有的统计数据放进一个数组,再将数组进行返回,缺点=>数组的数据类型必须一致 )
数组比较重要的是它的线性操作,数组与多个变量天相比它是一种有序的线性结构。
在写程序的时候,一定要本着一个原则,主方法就相当于一个客户端调用,因为是客户端调用所以里面的代码应该越简单越好。
数组数据类型还有一个问题是数据类型必须是一致的。

通过以上的强制类型转换操作可以轻微的解决数组只能存存一个类型数据的问题。但是很不推荐,强制类型转换慎用。
这节课的重点,在整个进行程序开发的时候,主方法不要涉及到过于复杂的程序逻辑,主方法应该只需要关注结果,跟结果之外的所有事情都不应该是之方法所关注的。
课时17 (数组案例,数组排序)
在很多面试题都会涉及到数组排序,但是不要写java.util.Arrays.sort(),要不然跟不得分差不多。
-
基础排序操作(最笨的方法-数组的冒泡排序),核心思想就是将数组一一遍历,更换数组元素之间的顺序,最终达到排序的目的。
图片.png
图片.png
代码实现冒泡排序
public static void mpSort( int[] arr ){
for(int x = 0 ; x < arr.length - 1 ; x ++){
for(int y = 0; x < arr.length - x - 1;/*此处防止索引越界*/ y ++ ){
if(arr[y]>arr[y+1]){
int temp = arr[y]; //这一步保存哪个,下一步就变哪个,否则保存的意义何在~
arr[y] = arr[y+1];
arr[y+1] = temp
}
}
}
}
//这里数组进行排序后不需要返回值的原因是,
栈内存中保存的只是一个地址,
方法形参进行引用传递,
当地址所对应的堆内存空间被修改的时候,
再次通过地址访问到的结果也会进行改变。
所以此处的返回值对我们并没有什么真正的用处。
冒泡排序的外层指的是需要排序的总次数,内层循环指的是每次循环需要做的事情。
课时18 数组转置
所谓数组转置最简单的理解就是数组反转排序。如果要想实现这样的交换,有两种实现思路:
-
1.开辟一个新的等长数组,将原始数组倒序排列
图片.png
第一种转置分析图

一共转置的次数是
数组长度除2长度奇数偶数都是一样的,只不过偶数个并没有数字中间轴。第一种转置方法代码示意图

- 问题:当实现反转之后会,会开辟两块堆内存空间,所以会造成空间浪费(空间复杂度高)(题外:如果是算 法类问题,出现的浪费那就叫做时间复杂度高)。空间占内存-内存占用率大,时间占cpu-CPU使用率高。
课时19 数组二分查找法
什么叫做二分查找?
如果现在需要在一个指定数组之中查询数组位置。那么我们可能想到的最简单的实现就是整体数组的遍历。
遍历方法如下:

但是这个算法的事件复杂度是n,也就是说所有的数组中的数据都需要进行一次遍历。这样才能够确认我们所需要查找的数据是否存在。那么有没有更快的查找操作呢?这时候我们就需要献祭出二分查找了(二分查找并不是二分树)。
二分查找有一个重要的前提,数组排序。如果数组不是一个有序数组,那就无法使用二分查找。
二分查找示意图:

实现二分查找(最佳实践是使用方法递归操作完成)
代码实现
public static int search(int[] arr,int from,int to,value){
int mid = (from/2) + (to/2); //确定中间点
if(from < to){
if(arr[mid] == value){
return mid;
}
else if(arr[mid] > value){
return search(arr,from,mid - 1,value);
}else if(arr[mid] < value){
return search(arr,mid + 1 ,to , value);
}
}else{
return -1
}
}
//在使用递归操作的时候,要想到,如果第一次循环的在各种情况下都是正确的,那么每次循环的情况都应该是正确的。当满足第一种情况的时候,就一定需要考虑递归的出口了,否则就会进入永真循环。




