C语言中数组的各种查找算法

数组的查找算法

顺序查找的特点

对于数据没有任何要求,从头到尾遍历数组即可

二分查找、插值查找各自的特点
相同点:

都是通过不断的缩小范围来查找对应的数据的

数据一定要是有序的

不同点:

计算mid的方式不一样

二分查找:mid每次都是指向范围的中间位置

插值查找:mid尽可能的靠近要查找的数据,但是要求数据尽可能的分布均匀

代码案例
#include <stdlib.h>
#include <stdio.h>
int order(int length,int arr[],int num);        //声明函数顺序查找法
int half(int length,int arr[],int num);         //声明函数2分查找法
int insert(int length,int arr[],int num);       //声明函数插值查找法
int main()
{
    int arr[] = {11,22,33,44,55}; //定义数组
    int length = sizeof(arr) / sizeof(arr[0]);      //计算数组长度
    int num = 44;                                   //假设要查找的数为44
    int index = insert(length,arr,num);             //调用最适合此数组的插值查找法
    printf("你要查找的数据的索引为:%d\n",index);
    return 0;
}
int order(int length,int arr[],int num)         //顺序查找
{
    int i;          //声明变量i
    for(i = 0;i < length;i++)       //循环数组中的元素
    {
        if(arr[i] == num)           //判断是否等于要查找的元素
        {
            return i;               //是的话返回此时索引
        }
    }
    return -1;                      //否返回不存在的索引-1
}
int half(int length,int arr[],int num)      //2分查找
{
    int min = 0;                            //定义min为头索引
    int max = length-1;                     //定义max为尾索引
    
    while(min<=max)                         //当min小于等于max,就进入循环
    {
        int mid = (max+min) / 2;            //定义中位索引
        if(num < arr[mid])                  //判断要查找到数是否大于中位索引对应的元素
        {
            max = mid - 1;                  //是的话就修改max为mid-1,缩小范围
        }
        else if(num > arr[mid])             //判断要查找到数是否小于中位索引对应的元素
        {
            min = mid + 1;                  //是的话就修改min为mid+1,缩小范围
        }
        else
        {
            return mid;                     //不大于不小于就只有等于,那么中位索引对于的元素就是要查找到值
        }
    }
    return -1;                              //当min大于max,就说明数组内没有这个元素,就返回不存在的索引-1
}
int insert(int length,int arr[],int num)        //插值查找
{
    int min = 0;
    int max = length-1;
    while(min<=max)
    {
        //插值查找和2分查找的区别就在于mid的定义
        //在 C 语言中,整数除法会截断小数部分,因此需要强制转换为 double 类型来避免整数截断
        int mid = min + (double)(num -arr[min]) / (arr[max] - arr[min]) * (max-min);
        if(num < arr[mid])
        {
            max = mid - 1;
        }
        else if(num > arr[mid])
        {
            min = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值