练习2—数据查找

简介: 练习2—数据查找

题目

有一组数12,56,45,78,90,80,23,16,8,63 保存在一个数组中,从键盘任意接收一个数,并在数组中查找该数给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置;如果找不到,输出没有找到的提示信息。

解题步骤

(1)接收;

(2)查找数据;

(3)对比;

(4)输出结果;

Java

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[] array = {12, 56, 45, 78, 90, 80, 23, 16, 8, 63};
        System.out.print("please enter the data you are looking for:");
        int user = input.nextInt(), i;
        for (i = 0; i <= 9; i++) {
            if (user == array[i]) {
                System.out.println(user + " " + "is element" + "[" + i + "]");
                break;
            }
            if (i == 9)
                System.out.println("no data " + user + " " + "found");
        }
        input.close();
    }
}

C语言

顺序查找

#include <stdio.h>
int main()
{
    int array[] = {12, 56, 45, 78, 90, 80, 23, 16, 8, 63}, TakeOver, Tag;
    printf("please enter any data:");
    scanf("%d", &TakeOver);
    for (int i = 0; i < 10; i++)
    {
        if (TakeOver == array[i])
        {
            printf("data %d location is array[%d];", TakeOver, i);
            Tag = 1;
            break;
        }
        else
            Tag = 0;
    }
    if (Tag == 0)
        printf("did not find %d", TakeOver);
    return 0;
}
  1. 本题关于“未找到信息的输出”,我们还可以这样想:如果一组数据,比对到最后一个都没有满足条件的,那么就认定为队列中没有该数据。
  2. 用这样的思想我们可以进行这样的改动:删除Tag标签,增加条件判断直接输出。这里注意变量i的自增,为了在i=10时仍能进入循环输出信息,判断条件应修改为i <= 10
#include <stdio.h>
int main()
{
    int array[] = {12, 56, 45, 78, 90, 80, 23, 16, 8, 63}, TakeOver;
    printf("please enter any data:");
    scanf("%d", &TakeOver);
    for (int i = 0; i <= 9; i++)
    {
        if (TakeOver == array[i])
        {
            printf("data %d location is array[%d];", TakeOver, i);
            break;
        }
        if (i == 9)
            printf("data %d was not found", TakeOver);
    }
    return 0;
}

说明

  1. 本题中最重要的是如何将已有数据和用户输入数据进行对比,也就是 “查找” 这一操作,代码1给出的是查找算法中最简单的 “顺序查找” 。
  2. 由于每次进入循环,变量i依次自增、逐个查找,如果我们仅仅只将单一的输出信息放在语句中而不进行其它判断的话,就会造成输出错误。所以增加变量Tag用于判断条件:如果数据相等(找到了),Tag值置 1 。如果没有找到,Tag值置0,循环外进行一次判断输出没有找到的提示信息。
  3. 我竟然试图用二分法解决,但是却忽略了使用二分(折半)查找的前提必须是有序表顺序存储。这里给出两种版本的二分法,注意算法适用条件。

二分查找

int Search1(int a[], int value, int n)
{
    int low, high, mid;  //定义最低位,最高位,中间位
    low = 0;
    high = n-1;   //数据从0开始,则最后一个为n-1,总数仍为n
    while(low<=high)
    {
        mid = (low+high)/2;
        if(a[mid]==value)    //中间值和待查找值相等,直接返回
            return mid;
        if(a[mid]>value)     //中间值大于待查找值,待查找值在中间值左边,最高位high置为mid-1
            high = mid-1;
        if(a[mid]<value)     //中间值小于待查找值,待查找值在中间值右边,最低为low置为mid+1
            low = mid+1;
    }
    return -1;
}
//递归版本
int Search2(int a[], int value, int low, int high)
{
    int mid = low+(high-low)/2;      //组中值 mid=(low+high)/2等价于mid=low+1/2*(high-low);
    if(a[mid]==value)
        return mid;
    if(a[mid]>value)
        return Search2(a, value, low, mid-1);  //函数递归调用
    if(a[mid]<value)
        return Search2(a, value, mid+1, high);
}


相关文章
|
7月前
|
算法 前端开发
在系统中查找重复文件
在系统中查找重复文件
78 0
|
2月前
|
算法
算法—查找假币
算法—查找假币
61 0
|
4月前
|
算法 C++
查找方式:依次查找与二分查找
查找方式:依次查找与二分查找
|
7月前
查找数据
查找数据。
37 1
|
算法
查找
查找是指在图中寻找特定的节点或边的过程。在图中进行查找操作可以帮助我们找到与目标节点或边相关的信息,或者判断图中是否存在某个节点或边。 在图中进行查找操作的常见算法有: 1. 深度优先搜索(DFS):从图中的一个节点开始,沿着一条路径一直深入直到无法再深入为止,然后回溯到上一个节点,继续深入其他路径,直到找到目标节点或遍历完所有节点。 2. 广度优先搜索(BFS):从图中的一个节点开始,先访问它的所有邻居节点,然后再依次访问邻居的邻居节点,直到找到目标节点或遍历完所有节点。 3. Dijkstra算法:用于在带权有向图中找到从一个节点到其他节点的最短路径。该算法通过不断更新节点的最短距离来逐步
80 0
|
7月前
排序和查找
排序和查找
61 0
二叉排序树的建立、查找、插入、删除
二叉排序树的建立、查找、插入、删除
117 0
|
搜索推荐
查找-之二叉排序树(查找、插入、删除)
有序的线性表采用:折半/二分、插值、斐波那契查找相比顺序查找效率得到提高,但是在插入和删除时效率低(为维持数据的有序性) 在高效实现查找操作时,如何提高插入和删除的效率? 在一些应用场景:在查找时需要插入和删除
163 0
查找-之二叉排序树(查找、插入、删除)
|
算法 大数据 索引
算法查找——分块查找
分块查找是折半查找(二分查找)和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序
265 0
算法查找——分块查找