数据结构和算法--7查找算法

1.常用的查找算法

1)    顺序(线性)查找
2)    二分查找/折半查找
3)    插值查找
4)    斐波那契查找 

2.查找

1)线性查找

A.题目:

有一个数列[1,43,22,-10,0],判断数列中是否包含此名称,如果找到了,就提示找到,并给出下标值。

B,思路:

逐一查找

C.代码

package com.offcn.search;
//线性查找
public class SeqSearch {
    public static void main(String[] args){
        int[] arr = {1,43,22,-10,0};
        int result = seqSearch(arr,0);
        if(result != -1){
            System.out.println("找到了!下标为"+result);
        }else{
            System.out.println("未找到");
        }
    }
    public static int seqSearch(int[] arr,int value){
        for(int i = 0;i < arr.length;i++){
            if(arr[i] == value){
                return i;
            }
        }
        return -1;
    }
}

D.输出:

 2)二分查找

A.题目1:

请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示“没有这个数”

B.思路:

 C.代码

package com.offcn.search;
//二分查找
public class BinarySearch {
    public static void main(String[] args){
        int[] arr = {1,8,10,89,1000,1234};
        int i = binarySearch(arr, 0, arr.length - 1, 1234);
        if(i == -1){
            System.out.println("未找到");
        }else {
            System.out.println("找到了!下标为"+i);
        }
    }
    public static int binarySearch(int[] arr,int left,int right,int findValue){
        //如果一直没找到,left可能会一直mid+1,超出范围
        if(left > right){
            return -1;
        }
        //数组中间下标
        int mid = (left+right)/2;
        int midValue= arr[mid];
        //如果查找的元素大于中间值,向右递归
        if(findValue > midValue){
            return binarySearch(arr,mid+1,right,findValue);
            //小于中间值,向左递归
        }else if(findValue < midValue){
            return binarySearch(arr,left,mid-1,findValue);
            //正好是中间值
        }else{
            return mid;
        }
    }
}

D.输出:

 A.题目2:

{1,8,10,89,1000,1000,1000,1000,1234}当一个有序数组中有多个相同的值,如何将所有的数值都查找到?

B.思路:

 C.代码

package com.offcn.search;

import java.util.ArrayList;

public class BinarySearchList {
    public static void main(String[] args){
        int[] arr = {1,8,10,89,1000,1000,1000,1000,1234};
        ArrayList<Integer> list = binarySearchList(arr, 0, arr.length - 1, 1000);
        System.out.println(list);

    }
    public static ArrayList<Integer> binarySearchList(int[] arr,int left,int right,int findValue){
        if(left > right){
            return new ArrayList<>();
        }

        int mid = (left+right)/2;
        int midValue= arr[mid];
        if(findValue > midValue){
            return binarySearchList(arr,mid+1,right,findValue);
        }else if(findValue < midValue){
            return binarySearchList(arr,left,mid-1,findValue);
        }else{
            //如果找到,则先不返回,创建一个集合装相同数值的下标
            ArrayList list = new ArrayList();
            //向mid的左边扫描,寻找同数值的下标加入到集合中
            int temp = mid-1;
            while (true){
                if(temp < 0 || arr[temp] != findValue){
                    break;
                }
                list.add(temp);
                temp -= 1;
            }
            list.add(mid);
            //向mid的右边扫描,寻找同数值的下标加入到集合中
            temp = mid+1;
            while (true){
                if(temp > arr.length-1 || arr[temp] != findValue){
                    break;
                }
                list.add(temp);
                temp += 1;
            }
            return list;
        }
    }
}

D.输出:

 3)插值查找

A.原理:

B.注意:

C.代码

package com.offcn.search;
//插值查找
public class InsertValSearch {
    public static void main(String[] args){
        int[] arr = new int[100];
        for(int i = 0; i < arr.length;i++){
            arr[i] = i+1;
        }
        int i = insertValSearch(arr, 0, arr.length-1, 100);
        System.out.println("下标为"+i);

    }
    public static int insertValSearch(int[] arr,int left,int right,int findVal){
        System.out.println("插值查找1次");
        //如果left>rigth 或者findValue的值不正确,返回-1
        if(left > right || findVal < arr[0] || findVal > arr[arr.length-1]){
            return -1;
        }
        //自适应mid
        int mid = left + (right -left) * (findVal-arr[left]) / (arr[right] -arr[left]);
        int midVal = arr[mid];
        if(findVal > midVal){
            return insertValSearch(arr,mid+1,right,findVal);
        }else if(findVal < midVal){
            return insertValSearch(arr,left,mid-1,findVal);
        }else {
            return mid;
        }
    }
}

D.输出:

原文地址:https://www.cnblogs.com/bai3535/p/12555071.html

时间: 2024-11-03 21:11:24

数据结构和算法--7查找算法的相关文章

从零开始_学_数据结构(四)——查找算法、索引、二叉排序树

查找算法 基本概念: (1)关键字:假如有结构 struct Node //一个结点,存储数据和指针 { DATA data; //数据属性,用于存储数据 int key; //假设key为int值,其在整个表里是唯一的 //指针域,具体略,指向其他结点,或者是数组的下标 }; key值便是关键字,对于每一个结点而言,其key值都是不一样的(不一定必须是int值).因此,当我们查找数据时,只要知道其key值,然后对比key值和我们要查找的key值是否相同,便能判断是否是我们要查找的数据了. 优点

数据结构Java版之查找算法(三)

关于查找算法,这里只进行两个算法的说明.包括 顺序查找 和 折半查找. 顺序查找: 顺序查找常用于未排序的数据中.查找速度较慢,只能应用于较小的数据量. public int sequentialSearch(int[] list, int ele) { for(int i = 0; i < list.length; i ++) { if(ele == list[i]) return i; } return -1; } 折半查找: 比较快的查找算法,但也仅限于对排好序的数据进行查找. publi

JS中数据结构之检索算法(查找算法)

顺序查找 查找指定值 function seqSearch(arr, data) { for (var i = 0; i < arr.length; ++i) { if (arr[i] == data) { return true; } } return false; } 查找最小值和最大值 function findMin(arr) { var min = arr[0]; for (var i = 1; i < arr.length; ++i) { if (arr[i] < min)

STL_算法_查找算法(find、find_if)

C++ Primer 学习中. .. 简单记录下我的学习过程 (代码为主) find . find_if /**********************线性查找O(n) find(); find_if(); 注意: 1.假设是已序区间,能够使用区间查找算法 2.关联式容器(set,map)有等效的成员函数find();时间复杂度O(log(n)) 3.string 有等效的成员函数find(); **********************/ #include<iostream> #inclu

算法----二分查找算法

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找, 2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7

面试常见算法-排序查找算法

算法是程序员必被的一个技能,在面试中常常出现,下面总结了面试中出现的常见算法,这些算法程序员应该牢记在心中,要非常熟练. 插入排序算法 原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序. 要点:设立哨兵,作为临时存储和判断数组边界之用. public class InsertSort { private static void insertSort(int[] a) { int j; int tmp; for

PHP的排序算法跟查找算法

排序算法: (1)冒泡排序 1 $arr = array(15,8,20,50,37,85,10,5,11,4); 2 //冒泡排序 3 function maoPao($arr){ 4 for($i = 0; $i < count($arr)-1; $i++){ 5 for($j = 0; $j < count($arr)-1; $j++){ 6 if($arr[$j] > $arr[$j+1]){ 7 $temp = $arr[$j]; 8 $arr[$j] = $arr[$j+1]

STL_算法_查找算法(lower_bound、upper_bound、equal_range)

C++ Primer 学习中. .. 简单记录下我的学习过程 (代码为主) //全部容器适用(O(log(n)))    已序区间查找算法 lower_bound()        //找第一个符合的元素,返回位置迭代器 upper_bound()        //找最后一个符合的元素.返回位置迭代器 equal_range()        //找一对迭代器pair(<>,<>) 关联式容器有等效的成员函数.性能更佳 #include<iostream> #incl

排序算法和查找算法

示例:分别用冒泡排序,快速排序,选择排序,插入排序将数组中的值从小到大的顺序排序 $array = (9,5,1,3,6,4,8,7,2); 1.冒泡排序算法 //思路:两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 function bubbleSort($array){         $lg = count($array);         if($lg <=1){             return $array;         }