• 查找算法


    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 }
  • 相关阅读:
    ABP 前端 组件之间传递参数的几种方式
    angular Form 自定义验证
    Docker 启用失败 failed to start docker Application container Engin
    C# 委托与事件
    c# Application.DoEvents()
    c# 泛型
    Ubuntu如何挂载U盘
    jdk1.8 List根据时间字段倒序排序
    yarn安装模块报错:check python checking for Python executable "python2" in the PATH
    yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。
  • 原文地址:https://www.cnblogs.com/weijuanran/p/Search.html
Copyright © 2020-2023  润新知