算法-查找(顺序和二分)

顺序表的查找

就是一个个去比对查找

#include<stdio.h>
#define maxsize 5

int sequentialsearch(int *a,int key)//要查找的数组,要查找的值,返回查找值对应对的数组下标
{
    int i;
    for(i=0;i<maxsize;i++)
    {
        if(a[i]==key)
            return i;
    }
    return -1;
}

void main()
{
    int n;
    int a[maxsize]={0,2,1,5,4};
    n=sequentialsearch(a,1);
    if(n!=(-1))
        printf("找到了!%d\n",n);
    else if(n==-1)
        printf("没找到!\n");
}

顺序表查找的优化

修改数组的存储方式,头设置为哨兵,减少了比大小的问题,效率更高

#include<stdio.h>
#define maxsize 6

int sequentialsearch(int *a,int key)//要查找的数组,要查找的值,返回查找值对应对的数组下标
{
    int i;
    a[0]=key;//数组的头设置为哨兵
    i=maxsize-1;//从数组尾开始
    while(a[i]!=key)
    {
        i--;
    }
    return i;//i=0则说明查找失败,否则返回查找的数组对应下标
}

void main()
{
    int n;
    int a[maxsize]={0,11,2,1,5,4};
    n=sequentialsearch(a,13);
    if(n)
        printf("找到了!%d\n",n);
    else if(!n)
        printf("没找到!\n");
}

有表的查找--二分法查找

1、首先必须是有序表,例如a[5]={0,8,45,65,98};

2、中间值min的取值不用太计较,123456,中间值是3还是4都是一样的,不影响程序的编写。

3、比中值大,说明在中值的右边,那么移动h到min+1,同理比中值小,说明在中值的左边,那么移动r到min-1。

二分程序代码

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
int a[maxsize]={1,2,3,5,9,40,45,52,56,78};

int chazhao(int n)
{
    int h,r,min;//头 尾 中
    h=0;
    r=maxsize-1;    
    while(h<=r)//当h>r时说明已经遍历完了
    {
        min=(h+r)/2;//中位置的确定,左一点右一点没有关系,比如123456,min等于3or4没关系,大概对半分开
        if(a[min]>n)//要查找的值在左半段,将尾更新
            r=min-1;
        else if(a[min]<n)//要查找的值在右半段,将头更新
            h=min+1;
        else if(a[min]=n)
            return min;
    }
    return -1;//返回查找失败
}

void main()
{
    int i;
    i=chazhao(100);
    if(i==-1)
        printf("查找失败!\n");
    else
        printf("数组的位置为下标%d\n",i);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值