查找算法
Java实现顺序查找、二分查找、插值查找
1 package com.java; 2 import java.util.Scanner; 3 4 public class Search { 5 public static void main(String[] args) { 6 int[] array = {10,5,8,9,6,12,3,45,7,11}; 7 int[] array2 = {1,3,4,5,6,8,9,10,12,13,15};//二分和插值查找数组为有序序列 8 System.out.print("请输入查找值并回车:"); 9 Scanner sc = new Scanner(System.in); 10 int key = sc.nextInt(); 11 12 //int result = SeqSearch2(array,key); 13 //int result = BiSearch(array2,0,array2.length-1,key); 14 int result = ChaSearch(array2,0,array2.length-1,key); 15 System.out.print("查找到的位置是:" + result); 16 17 } 18 19 /** 20 * 顺序查找基本原理: 21 * 遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。 22 * 如果直到最后一个记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。 23 */ 24 public static int SeqSearch(int[] arr,int key){ 25 for(int i=0;i<arr.length;i++){ 26 if(arr[i]==key){ 27 return i;//查找成功,返回查找位置 28 } 29 } 30 return -1; //查找失败,返回-1 31 } 32 33 /** 34 * 优化的顺序查找: 35 * a[0]存放要查找的关键字key,减少了数组越界的比较,如果查找表长度很大,比最简单的顺序查找快很多。 36 * ps:a[0] = key的目的就是让上述的简单顺序查找的两次判断修正为一次a[i]与a[0]是否相等的一次判断。 37 */ 38 public static int SeqSearch2(int[] arr,int key){ 39 int i; 40 arr[0]=key; 41 for(i=arr.length-1;arr[i]!=arr[0];i--); 42 return i; 43 } 44 45 /** 46 * 二分查找基本思想: 47 * 在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功; 48 * 若给定值小于中间记录的关键字,则在中间记录的左半区继续查找; 49 * 若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。 50 * 从二分查找的定义我们可以看出,使用二分查找有两个前提条件: 51 * 1,待查找的列表必须有序。 52 * 2,必须使用线性表的顺序存储结构来存储数据。 53 */ 54 public static int BiSearch(int[] arr,int low,int high,int key){ 55 int mid = (low+high)/2; 56 if(arr[mid]==key){ 57 return mid; 58 } 59 if(arr[mid]>key){ 60 return BiSearch(arr,low,mid-1,key);//搜索左半部分 61 }else{ 62 return BiSearch(arr,mid+1,high,key);//搜索右半部分 63 } 64 65 } 66 67 /** 68 * 插值查找基于二分查找,根据我们需要查询的值的渐进进行搜索的. 69 * 插值查找的不同点在于每一次并不是从中间切分,而是根据离所求值的距离进行搜索的. 70 */ 71 public static int ChaSearch(int[] arr,int low,int high,int key){ 72 int mid = low + (key-arr[low])/(arr[high]-arr[low])*(high-low); 73 if(arr[mid]==key){ 74 return mid; 75 } 76 if(arr[mid]>key){ 77 return ChaSearch(arr,low,mid-1,key); 78 }else{ 79 return ChaSearch(arr,mid+1,high,key); 80 } 81 82 } 83 }