一、线性查找
package com.xianxing.array;
/**
* 线性查找
*
* @author l1
*
*/
public class TestSearch {
public static void main(String[] args) {
// 目标数组
int[] arr = new int[] { 2, 15, 3, 6, 4, 86, 96, 41 };
// 目标元素
int target = 6;
// 目标元素所在下标
int index = -1;
// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("找不到目标元素");
} else {
System.out.println("找到目标元素,下标为:" + index);
}
}
}
二、二分法查找
package com.xianxing.array;
/**
* 二分法查找:仅用于有序的目标数组
*
* @author l1
*
*/
public class TestBinarySearch {
public static void main(String[] args) {
// 目标数组
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 目标元素
int target = 0;
// 记录开始位置
int begin = 0;
// 记录结束位置
int end = arr.length - 1;
// 记录中间的位置
int mid = (begin + end) / 2;
// 记录目标位置
int index = -1;
// 循环查找
while (begin <= end) {
// 判断中间元素是不是要查找的元素
if (arr[mid] == target) {
index = mid;
break;
} else {
// 判断中间元素比目标元素大还是小
if (arr[mid] > target) {
end = mid - 1;
} else {
begin = mid + 1;
}
// 取出新的中间位置
mid = (begin + end) / 2;
}
}
if (index == -1) {
System.out.println("找不到目标元素");
} else {
System.out.println("找到目标元素,下标为:" + index);
}
}
}
三、面向对象查找
package com.xianxing.array1;
import java.util.Arrays;
import javax.management.RuntimeErrorException;
/**
* 面向对象数组
*
* @author l1
*
*/
public class MyArray {
// 用于存储数据的数组
private int[] elements;
public MyArray() {
elements = new int[0];
}
// 获取数组长度
public int size() {
return elements.length;
}
// 往数组末尾添加一个元素
public void add(int element) {
int newArr[] = new int[elements.length + 1];
for (int i = 0; i < elements.length; i++) {
newArr[i] = elements[i];
}
newArr[elements.length] = element;
elements = newArr;
}
// 打印所有元素
public void show() {
System.out.println(Arrays.toString(elements));
}
// 删除一个元素
public void delete(int index) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
int[] newArr = new int[elements.length - 1];
for (int i = 0; i < newArr.length; i++) {
if (i < index) {
newArr[i] = elements[i];
} else {
newArr[i] = elements[i + 1];
}
}
elements = newArr;
}
// 获取某个下标的元素
public int get(int index) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
return elements[index];
}
// 插入一个元素到指定位置
public void insert(int index, int element) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
int newArr[] = new int[elements.length + 1];
for (int i = 0; i < newArr.length - 1; i++) {
if (i < index) {
newArr[i] = elements[i];
} else {
newArr[i + 1] = elements[i];
}
}
newArr[index] = element;
elements = newArr;
}
// 替换指定的元素
public void set(int index, int element) {
// 判断下标是否越界
if (index < 0 || index > elements.length - 1) {
throw new RuntimeException("下标越界");
}
elements[index] = element;
}
// 线性查找
public int search(int target) {
// 遍历数组
for (int i = 0; i < elements.length; i++) {
if (elements[i] == target) {
return i;
}
}
return -1;
}
// 二分法查找
public int binarySearch(int target) {
// 记录开始位置
int begin = 0;
// 记录结束位置
int end = elements.length - 1;
// 循环查找
while (begin <= end) {
// 记录中间的位置
int mid = (begin + end) / 2;
// 判断中间元素是不是要查找的元素
if (elements[mid] == target) {
return mid;
} else {
// 判断中间元素比目标元素大还是小
if (elements[mid] > target) {
end = mid - 1;
} else {
begin = mid + 1;
}
}
}
return -1;
}
}
package com.xianxing.array1;
public class MyArrayTest {
public static void main(String[] args) {
MyArray ma = new MyArray();
System.out.println("ma数组的长度:" + ma.size());// ma数组的长度:0
ma.show();// []
ma.add(3);
ma.add(6);
ma.add(99);
ma.add(95);
System.out.println("ma数组的长度:" + ma.size());// ma数组的长度:4
ma.show();// [3, 6, 99, 95]
ma.delete(1);
ma.show();// [3, 99, 95]
System.out.println(ma.get(1));// 99
ma.add(55);
ma.add(36);
ma.show();// [3, 99, 95, 55, 36]
ma.insert(3, 86);
ma.show();// [3, 99, 95, 86, 55, 36]
ma.set(4, 64);
ma.show();// [3, 99, 95, 86, 64, 36]
// 线性查找
System.out.println("index:" + ma.search(86));// index:3
// 二分法查找:必须是有序数组
MyArray bs = new MyArray();
for (int i = 0; i <= 80; i = i + 5) {
bs.add(i);
}
bs.show();
// [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80]
System.out.println("index:" + bs.binarySearch(55));// index:11
}
}