推荐学习资料:JAVA数组详解
数组
定义:
数组是用于储存多个相同类型数据的集合。也是许多线性数据结构基础组件,如:ArrayList,Vector。
创建:
代码:
public static void main(String[] orgs) { //创建一个数组 int[] arr1 = new int[3];//声明后设置长度不赋值 //int[] arr2 = {1,2,3};//声明后直接赋值 //获取数组长度 int length1 = arr1.length; System.out.println("arr1's length : " + length1); //赋值与访问数组的元素: 元素[下标] 区别与人类计数方式,计算机计数通常是由0开始 arr1[0] = 55; arr1[1] = 66; arr1[2] = 77; System.out.println("element1 's : " + arr1[0]); }
输出:
arr1's length : 3
element1 's : 55
数组模拟List:
代码:
import java.util.Arrays; /** * 可变数组,相当于手写Arraylist一部分实现 * @author Mr.Cao */ public class VariableArray { //基础数组,核心 private int[] elements; public VariableArray() { elements = new int[0] ; } //获取数组长度 public int size() { return elements.length; } //打印数组 public void show() { System.out.println(Arrays.toString(elements)); } //获取某个元素 public int get(int index) { //判断下标的合法性,是否越界 if(index < 0 || index > (elements.length - 1)) { throw new RuntimeException("length : " + elements.length +",index : "+ index +",数组下标越界!"); } return elements[index]; } //往数组的末尾添加一个元素 public void add(int element) { //创建一个新数组 int[] newArray = new int[elements.length + 1]; //为新数组赋值 for (int i = 0; i < elements.length; i++) { newArray[i] = elements[i]; } //添加到新数组末尾 newArray[newArray.length - 1] = element; //将原始数组指向新数组 elements = newArray; } //删除数组中的元素 public void del(int index) { //判断下标的合法性,是否越界 if(index < 0 || index > (elements.length - 1)) { throw new RuntimeException("length : " + elements.length +",index : "+ index +",数组下标越界!"); } //创建一个新数组 int[] newArray = new int[elements.length - 1]; //赋值元素到新数组 for (int i = 0; i < newArray.length; i++) { //实现思路:只复制坐标之前的元素与之后的元素 if (i < index) { newArray[i] = elements[i]; } else { newArray[i] = elements[i + 1]; } } //将原始数组指向新数组 elements = newArray; } //插入元素到指定位置 public void insert(int index,int element) { //判断下标的合法性,是否越界 if(index < 0 || index > (elements.length - 1)) { throw new RuntimeException("length : " + elements.length +",index : "+ index +",数组下标越界!"); } //创建一个新数组 int[] newArray = new int[elements.length + 1]; //赋值元素到新数组 for (int i = 0; i < elements.length; i++) { //实现思路:只复制坐标之前的元素与之后的元素,新数组在坐标留下空位 if (i < index) { newArray[i] = elements[i]; } else { newArray[i + 1] = elements[i ]; } } //赋值到空位 newArray[index] = element; //将原始数组指向新数组 elements = newArray; } }
运行方法:
public static void main(String[] orgs) { //测试可变数组 VariableArray list = new VariableArray(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.show(); //list.del(9); //list.show(); list.insert(4, 0); list.show(); }
输出:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 0, 5]
基于数组的查找算法-二分法:
- 准备的数组需要可比较大小的类型,并且升序排序;
- 准备三个变量存储下标,查找数组范围的开始下标,中间下标,结束下标;
- 将数组中间位置记录的值与查找关键字比较,如果两者相等,则查找成功;
- 如果中间下标记录的值大于查找的值,那么说明值在开始下标与中间下标的范围以内,改变查找范围的下标;
- 开始下标不变,结束下标等于中间下标,中间下标=[开始下标 + 结束下标 / 2];
- 如果中间下标记录的值小于查找的值,那么说明值在中间下标与结束下标的范围以内,改变查找范围的下标;
- 结束下标不变,开始下标等于中间下标,中间下标=[开始下标 + 结束下标 / 2];
- 重复以上过程,直到找到满足条件的记录,使查找成功,或直到数组值不存在为止,此时查找不成功。
图解:
![]()
代码实现:
/** * 二分法查找 * @author Mr.Cao */ public class BinarySearch { public static void main(String[] args) { //目标数组 int[] arr = new int[] {1,2,3,4,5,6,7,8,9}; //目标元素 int target = 5; //记录开始位置 int begin = 0; //记录结束位置 int end = arr.length - 1; //记录中间位置 int mid = (begin + end) / 2; //记录位置 int index = 0; while (true) { //首先判断中间位置的元素是不是需要查找的值 if(arr[mid] == target) { index = mid; break; } else if (arr[mid] > target) { end = mid - 1; } else if (arr[mid] < target) { begin = mid + 1; } mid = (begin + end) / 2; //未找到,返回-1 if(mid == 0 || mid == (arr.length - 1)) { index = -1; break; } } System.out.println(index); } }
![]()
输出:
4