查找算法

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 }
原文地址:https://www.cnblogs.com/weijuanran/p/Search.html