数组搜索(search)之线性搜索与二分法搜索
2016-04-28 11:21
309 查看
线性搜索代码比较简单,也通俗易懂,就是挨个遍历,查找数组中与key相同的元素,若查找不到,则可以返回-1(惯例,自定义),其效率为O(n).
二分法搜索代码稍稍复杂,有一个很重要的前提是数组必须是有序的。定义一个索引low(表征搜索索引下限),high(表征搜索索引上限),mid(即索引中间值)。
当key与mid位置的元素相同时,直接将mid返回,而当key大于mid位置的元素,即key若存在一定存在于后半段时,这是我们可以将mid+1赋值给low,重新计算mid。此时还是比较key与mid位置的元素,若key与mid位置的元素相同时,直接将mid返回,而当key小于mid位置的元素时,我们将mid-1赋值给high,重新计算mid。这样反复进行下去,直到low>high,此时表明数组里面没有key相同的元素。
线性搜索代码
测试类
二分法搜索代码
测试类
二分法搜索代码稍稍复杂,有一个很重要的前提是数组必须是有序的。定义一个索引low(表征搜索索引下限),high(表征搜索索引上限),mid(即索引中间值)。
当key与mid位置的元素相同时,直接将mid返回,而当key大于mid位置的元素,即key若存在一定存在于后半段时,这是我们可以将mid+1赋值给low,重新计算mid。此时还是比较key与mid位置的元素,若key与mid位置的元素相同时,直接将mid返回,而当key小于mid位置的元素时,我们将mid-1赋值给high,重新计算mid。这样反复进行下去,直到low>high,此时表明数组里面没有key相同的元素。
线性搜索代码
import java.util.Random; import java.util.Arrays; public class LinearArray { private int[] data; private static final Random generator = new Random(); public LinearArray(int size){ data = new int[size]; for (int i =0; i<size;i++){ data[i] = generator.nextInt(90) + 10; } } public int linearSearch(int searchKey){ for (int index = 0; index<data.length; index++){ if (data[index] == searchKey) return index; } return -1; } public String toString(){ return Arrays.toString(data); } }
测试类
import java.util.Scanner; public class LinearSearchTest { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int searchInt, position; LinearArray searchArray = new LinearArray(10); System.out.println(searchArray+"\n"); System.out.print("Please enter an integer value(-1 to quit):"); searchInt = input.nextInt(); while(searchInt != -1){ position = searchArray.linearSearch(searchInt); if (position == -1) System.out.println("The integer "+ searchInt+" was not found.\n"); else System.out.println("The integer "+searchInt+" was found in position " +position+"\n"); System.out.print("please enter an integer value(-1 to quit):"); searchInt = input.nextInt(); } } }
二分法搜索代码
import java.util.Random; import java.util.Arrays; public class BinarySearch { private int[] data; private static final Random generator = new Random(); public BinarySearch(int size){ data = new int[size]; for (int i = 0; i< data.length;i++) data[i] = 10 + generator.nextInt(90); Arrays.sort(data); } public int binarySearch(int searchElement){ int low = 0; int high = data.length-1; int mid = (low+high+1)/2; int location = -1; do{ if (searchElement == data[mid]) location = mid; else if (searchElement <data[mid]) high = mid -1; else low = mid + 1; mid = (low+high+1)/2; } while((low<=high)&&(location ==-1)); return location; } public String toString(){ return Arrays.toString(data); } }
测试类
import java.util.Scanner; public class BinarySearchTest { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int searchInt, position; BinarySearch searchArray = new BinarySearch(10); System.out.println(searchArray.toString()+"\n"); System.out.print("Please enter an integer value(-1 to quit):"); searchInt = input.nextInt(); while(searchInt != -1){ position = searchArray.binarySearch(searchInt); if (position == -1) System.out.println("The integer "+ searchInt+" was not found.\n"); else System.out.println("The integer "+searchInt+" was found in position " +position+"\n"); System.out.print("please enter an integer value(-1 to quit):"); searchInt = input.nextInt(); } } }
相关文章推荐
- 变频器控制器设计
- 【C#-Socket监听消息处理】
- 判断A是不是B的旋转字符串的3种方法
- 在模板定义语法中关键字class与typename的作用完全一样。
- Python中的exec、eval使用实例
- 线程-synchronized(this)的含义和wait和sleep的区别
- 基础类、二维数组的定义格式、File类
- sql server 2000数据库普通行列转换
- Javascript前台简单验证插件
- Javascript前台简单验证插件2
- 数据库事务的四个基本要素
- httpd 系统错误 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll
- 查看CPU是否支持虚拟化
- 表单form的enctype="multipart/form-data"使用疑惑
- CNMeM is disabled
- 01- Shell脚本学习--入门
- Trie的java实现
- 知道这20个正则表达式,能让你少写1,000行代码
- Linux命令学习之路
- Mycat 数据库分库分表中间件