采用二分查找(即折半查找)的方法实现查找

来源:互联网 发布:淘宝卖家打假关店 编辑:程序博客网 时间:2024/05/29 15:29

  采用二分查找的方法实现查找

1)定义顺序表的存储结构;

2)实现顺序表上二分查找;



代码实现:

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<queue>
#include<malloc.h>//头文件包含malloc函数,用来申请内存空间
#include<algorithm>
#include<math.h>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define N 10 // 数据元素个数
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef int KeyType; // 设关键字域为整型

//数据元素的类型  
struct ElemType
{
    int key;
};

//静态查找表的顺序存储结构  
struct SSTable
{
    ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用)  
    int length;//表的长度  
};

//对于两个数值型变量的比较约定为如下的宏定义  
#define EQ(a,b) ((a) == (b))  
#define LT(a,b) ((a) < (b))  
#define LQ(a,b) ((a) <= (b))  

//由n个数据元素的数组r,构造静态查找表ST  
void Create_Seq(SSTable &ST, ElemType r[], int n)
{
    int i;
    //ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType));//动态生成n+1个数据元素空间,0号单元不用  
    ST.elem = (ElemType*)malloc((n + 1)*sizeof(ElemType));
    if (!ST.elem)
        exit(ERROR);
    for (i = 1; i <= n; i++)
        ST.elem[i] = r[i - 1];//将数组的元素依次赋值给ST  
    ST.length = n;
}

void Ascend(SSTable &ST)//重建静态查找表为按照关键字为非降序排列  
{
    int i, j, k;
    for (i = 1; i < ST.length; i++)
    {
        k = i;
        ST.elem[0] = ST.elem[i];//待比较的元素存入0号单元  
        for (j = i + 1; j <= ST.length; j++)
        {
            if (LT(ST.elem[j].key, ST.elem[0].key))
            {
                k = j;
                ST.elem[0] = ST.elem[j];
            }
        }
        if (k != i)//有更小的值则交换  
        {
            ST.elem[k] = ST.elem[i];
            ST.elem[i] = ST.elem[0];
        }
    }
}

//在有序表ST中,折半查找关键字等于key的数据元素,返回在表中的位置(查找有序的顺序表)  
int Search_Bin(SSTable &ST, long key)
{
    int low, mid, high;
    low = 1;
    high = ST.length;//置区间初值  
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (EQ(ST.elem[mid].key, key))
            return mid;
        else if (LT(key, ST.elem[mid].key))
            high = mid - 1;//继续在前半个区间查找  
        else
            low = mid + 1;//继续在后半个区间查找  
    }
    return 0;//没有查找到  
}

//顺序表的有序查找  
int main()
{
    SSTable st;
    int i,n;
    int s;
    ElemType r[50];
    printf("请输入您所要查找的序列的元素个数:");
    scanf("%d", &n);
    printf("请按照从小到大的顺序输入各元素的值:");
    for (int i = 0; i < n; i++) {
        scanf("%d", &r[i]);
    }
    Create_Seq(st, r, n);//建立无序的顺序查找表  
    Ascend(st);//将无序的查找表重建为按照关键字非降序排列的查找表  
    printf("请输入你要查找值得关键字:");
    scanf("%d", &s);
    i = Search_Bin(st, s);
    if (i)
        printf("存在您要找的关键字%d,且是第%d个关键字\n", st.elem[i].key, i);
    else
        printf("不存在您要找的关键字!");


    return 0;
}


执行结果:


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 捡了个小米max被绑定了怎么办 二十岁时头发开始掉了怎么办 在酒店换衣服忘记关窗帘了怎么办 淘宝店铺装修更改图片要收费怎么办 惠阳市教育考试考证号忘记怎么办 高考完被被骗去读自考以后怎么办 孩子学习遇到瓶颈期了老师该怎么办 微信家长群有不好的言论出现怎么办 铃木汽车后备箱电动锁没有电怎么办 坐飞机没有连号座位带孩子怎么办 白沙的衣服洗衣服时染上颜色怎么办 网购商家少发了货怎么办 我想成为安利的员工怎么办会员 安利皇后锅锅盖吸在桌子上怎么办 淘宝客服退款返佣金诈骗后怎么办 第一试用网的钱提现出现问题怎么办 一个手机号注册两个京东账号怎么办 白色衣服被洗衣粉泡白了怎么办 白色衣服染成一块块荧光色了怎么办 中脉远红镇痛护腰不会发热了怎么办 用完悦诗风吟脸变黑不均匀怎么办 护肤品开封后一年还没用完怎么办 兰蔻化妆品套装正品和假怎么办 月经期间卫生巾搞得屁股疼怎么办 大姨妈特别多用卫生巾老是漏怎么办 夏天用卫生巾不透气摩擦红了怎么办 在日本的洗手间用完的姨妈巾怎么办 想穿短裙但是膝盖怕凉怎么办 裤子被卫生巾粘住扯不下来怎么办 医生说来姨妈不可以用卫生巾怎么办 隆胸以后摸起来感觉假体会动怎么办 产后15个月说恶露没排干净怎么办 母猪产后两天肚子里还有小猪怎么办 背心式无痕运动文胸显得胸小怎么办 卫生巾过敏起疙瘩反复挠不好怎么办 去健身房办卡老板跑了怎么办 买货我已经拒收商家不退款怎么办 在京东买了东西拒收不退款怎么办 罗马仕充电宝进入休眠状态怎么办 广发信用卡寄到家没拿到快递怎么办 包邮商家要买家出物流费怎么办?