Arrays数组工具类
工具类 特点: 只提供一个私有的无参构造 --- 无法new出对象
所有的方法都被static修饰 --- 可以通过类名直接调用
工具类中提供的方法:
void rangeCheck(int arrayLength, int fromIndex, int toIndex) : 校验数组索引范围是否合法
void sort(int[] a) : 将数组a默认升序排序
int binarySearch(int[] a, int key) : 使用二分查找算法查key在数组a中的索引并返回
boolean equals(int[] a, int[] a2) : 比较数组a和a2是否相同
void fill(int[] a, int val) : 将元素val填充到数组a
int[] copyOf(int[] original, int newLength) : 从original数组的0号索引位置开始拷贝,拷贝newLength个到新数组中并返回新数组
int[] copyOfRange(int[] original, int from, int to) : 拷贝original中[form,to) 索引范围内的元素到新数组并返回
List<T> asList(T... a) : 将可变参数(数组) 转为集合
String toString(int[] a) : 将数组a 拼接成字符串返回 ---> "[1,2,3,4,5]"
线性查找
int[] arr = {3, 8, 1, 5, 2, 7, 4, 6, 9};使用线性查找出:元素5在数组中的索引位置
优点: 思路简单
缺点: 性能不稳定
二分查找
引入: 使用二分查找发查出元素5在数组中的索引位置
int[] arr = {1,2,3,4,5,6,7,8,9,10};
使用二分查找的前提条件:数组 + 有序
1. 使用长度确定之后不可变的容器: 数组
2. 元素必须有序: 从小到大,从大到小
数组的算法
-- 排序类:
1. 冒泡排序:
2. 选择排序:
冒泡排序
从小到大: 相邻两个元素做比较,如果上一个元素大于下一个元素,则交换位置。
从大到小: 相邻两个元素做比较,如果上一个元素小于下一个元素,则交换位置。
需求: 使用冒泡排序,将数组:{3,5,4,2,1} 中元素从小到大排序
需求: 使用冒泡排序,将数组:{18,57,2,55,32,10,9,6,12} 中元素从小到大排序
明确: 先不考虑代码优化
总结:不考虑优化
1. 使用for循环确定循环轮数: arr.length-1轮
2. 使用for循环确定每一轮比较的次数: arr.length-1 - i次
3. 判断 arr[j] 和arr[j+1]大小
4. 交换 arr[j] 和arr[j+1]的位置
代码优化:
1. 减少每一轮比较的次数 : 内层循环次数变为:arr.length-1 - i次
2. 减少排序的轮数 :
选择排序
需求: 使用选择排序,将数组:{3,5,4,2,1} 中元素从小到大排序
需求: 使用选择排序,将数组:{3,5,4,2,1} 中元素从大到小排序
总结:
1. 确定排序的轮数: arr.length-1 循环变量i [0, arr.length-2]
2. 求出[i,arr.length-1]索引范围内的最小值的位置:index
3. 交换arr[index] 和 arr[i]