顺序查找与折半查找(二分查找)

折半查找

//折半查找
int Binary_Search(SSTable L,ElemType key)
{
    int low=0,high=L.TableLen-1,mid;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(L.elem[mid]==key)
            return mid;
        else if(L.elem[mid]>key)
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;
}

完整代码

//导入包
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//起别名
typedef int ElemType;//
//定义结构体
typedef struct{
    //注意ElemType存储的是类型,而int存储的是个数,所以下面的int不能用ElemType代替
    ElemType *elem;//整型指针
    int TableLen;//存储动态数组里边元素的个数
}SSTable; 
//折半查找
int Binary_Search(SSTable L,ElemType key)
{
    int low=0,high=L.TableLen-1,mid;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(L.elem[mid]==key)
            return mid;
        else if(L.elem[mid]>key)
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;
}

int Search_Seq(SSTable ST,ElemType key)
{
    ST.elem[0]=key;//让零号元素作为哨兵(标记)
    int i;
    for(i=ST.TableLen-1;ST.elemp[i]!=key;--i);
    return i;
}
//随机数的生成
void ST_Init(SSTable &ST,int len)
{
    ST.TableLen=len+1;//多申请一个位置,为了存放哨兵
    ST.elem=(ElemType *)malloc(sizeof(ElemType)*ST.TableLen);
    int i;
    srand(time(NULL));//随机数的生成
    for(i=0;i<ST.TableLen;i++)
    {
        ST.elem[i]=rand()%100;
    }
}
int compare(const void *left,const void *right)//一个比较规则 left,right是任意两个元素的地址值
{
    return *(ElemType*)left-*(ElemType*)right;//从小到大排序,返回正值
}
int main()
{
    SSTable ST;
    ElemType key;
    int pos;//查询存储元素的位置
    ST_Init(ST,10);
    ST_print(ST);
    printf("请输入要搜索的key值:\n");
    scanf("%d",&key);
    pos=Search_Seq(ST,key);
    if(pos)
    {
        printf("查找成功,位置为%d\n",pos);
    }
    else{
        printf("查找失败\n");
    }
    qsort(ST.elem,ST.TableLen,sizeof(int),compare);//qsort实现的是快排
    ST_print(ST);
    printf("二分查找,请输入要搜索的Key值:\n");
    scanf("%d",&key);
    //有序数组
    pos=Binary_Search(ST,key);//二分查找,即折半查找。前提,数组必须是有序的
    if(pos!=-1)
    {
        printf("查找成功,位置为%d\n",pos);
    }
    else{
        printf("查找失败\n");
    }
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值