6.【查找 算法】

本文比较了顺序查找和二分法查找算法在查找数据时的效率,强调了二分法在大量有序数据中的优势,特别是在inta[1000]这样的大数组中
摘要由CSDN通过智能技术生成

1. 顺序查找

从头到尾遍历一遍,耗时长、效率低。

  1. main函数中定义一个数组int a[10] = {12,34,45,23,54,2,4,65,23};
  2. 定义一个函数,查找指定数据
  3. 如果找到了,返回它的位置,数组下标即可,未找到返回-1
  4. main函数中测试
#include <stdio.h>
typedef int DataType;

// p:保存数组首地址,n:元素总个数,value:要查找的值
// 数组长度,只能传入。数组名作为参数会退化成地址,不能计算内存大小
int findByOrder(int *p, int n, int value)
{
    for (int i = 0; i < n; i++)
        if (p[i] == value)
            return i; //返回数组下标

    return -1; //如果程序能执行到这肯定没找到
}

int main()
{
    DataType arr[10] = {12, 34, 54, 23, 12, 3453, 564, 23, 121, 9};

    DataType data;                        //要查询的数据值
    int num = sizeof(arr) / sizeof(*arr); //元素总个数

    puts("Please input need Find Data:");
    scanf("%d", &data);

    int ret = findByOrder(arr, num, data); //存储,结果的下标
    if (ret == -1)
        printf("Not find %d\n", data);
    else
        printf("Find %d at:%d \n", arr[ret], ret);

    return 0;
}

顺序查找:当数据较多时int a[1000];,查找慢。

2. 二分法查找

分半查找、拆半查找

每次都找中间的数。

前提条件:数组中元素必须为(递增/递减)有序序列。

思想:每次进行分半,判断在middle的左边还是右边

#include <stdio.h>

// 二分查找
// value 代表的是被查找的值
// len 代表数组 长度(元素个数)
int findByHalf(int *p, int len, int value)
{
    int low = 0;        //low 低  //开头 位置 下标
    int high = len - 1; //high高  //末尾 位置 下标
    int middle;         //用来保存 中间位置 的下标

    // 从 [0,末尾下标] 都要遍历
    // 注意此处循环结束的条件,需要加上 =
    while (low <= high)
    {
        //不断获取中间位置的下标
        middle = (low + high) / 2;

        //如果在前半段,移动high
        if (value < p[middle])
            high = middle - 1;

        //如果在后半段,移动low
        else if (value > p[middle])
            low = middle + 1;

        //对应 正中间 情况
        else if (value == p[middle])
            return middle;
    }

    return -1; //代表没有找到
}

int main(int argc, const char *argv[])
{
    int arr[] = {12, 34, 56, 77, 89, 342, 567, 7898};
    int len = sizeof(arr) / sizeof(arr[0]); // 数组长度

    for (int i = 0; i < len; i++) //把数组中的每个元素都找一遍,进行测试程序
        printf("%d post is %d\n", arr[i], findByHalf(arr, len, arr[i]));

    // 查找10000返回 -1
    printf("\n%d post is %d\n", 10000, findByHalf(arr, len, 10000));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值