Java数据结构_2.数组的查找算法

一、线性查找

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
	}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值