鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 小甲鱼

[技术交流] 折半查找法(迭代实现)

[复制链接]
发表于 2015-11-15 16:19:58 | 显示全部楼层
love_programe 发表于 2015-10-11 14:22
这个算法貌似就是那个所谓的“二分法”吧!!
#include<iostream>
using namespace std;

int bin_search( int str[], int low, int high, int key )
{
        if( low > high )
        {
                return -1;
        }
        
        int mid = ( low + high )/2;
        
        if( str[mid] == key )
        {
                return mid;
        }
        else if( str[mid] < key )
        {
                bin_search( str, mid+1, high, key );
        }
        else if( str[mid] > key )
        {
                bin_search( str, low, mid-1, key );        
        }
        
}

int main()
{
        
        int str[11]={1,2,3,4,5,6,7,8,9,10,11};
        int add,n,low,high;
        
        low=0;
        high=11-1;
        
        cout<<"please input search number:";
        cin>>add;
        
        n = bin_search( str, low, high, add );
        
        cout<<"search success!"<<endl;
        cout<<"search number:"<<add<<" ,"<<"locate:"<<n<<endl;
        
        return 0;
}
交个作业,有参考楼上的同学,勿怪!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-18 15:10:07 | 显示全部楼层
/*
**折半查找法--迭代实现
**2016年9月17日 20:57:55
*/

//折半查找法的前提条件: 待查找的元素已经按顺序排列好
//设置3个指针, low, middle, high
//low指向查找区域的下界, high指向查找区域的上界, middle = (low + high) / 2

#include <stdio.h>

#define FIND 1
#define NOTFIND 0
#define SIZE 15            //数组的长度

typedef int Status;
typedef int ElemType;

Status half_search(ElemType *, ElemType, int *);     //待查找的数组, 需要查找的元素, 查找到的下标

int main()
{
        ElemType data[SIZE] = {1, 1, 2, 3, 5 ,8, 13, 21, 34, 55, 89, 144, 233, 377, 610};
        ElemType e;                                    //元素按从小到大的顺序排列
        int index;
        printf("请输入要查找的元素:\n");
        scanf("%d", &e);
        if(half_search(data, e, &index))
                printf("查找成功! 元素%d在数组中的下标为%d\n", e, index);
        else
                printf("查找失败! 元素%d不在数组中\n", e);
        return 0;
}

//迭代查找法迭代实现
Status half_search(ElemType *data, ElemType e, int *index)
{
        int low, high, middle;
        low = 0;                           //初始化三个指针
        high = SIZE - 1;
        middle = (low + high) / 2;
        while(low != high)
        {
                if(e > data[middle])
                        low = middle + 1;
                else if(e < data[middle])
                        high = middle - 1;
                else
                {
                        *index = middle;
                        return FIND;       
                }
                middle = (low + high) / 2;
        }
        if(e == data[middle])
        {
                *index = middle;
                return FIND;       
        }
        else
                return NOTFIND;
}











想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-3 16:59:05 | 显示全部楼层
缘缘 发表于 2013-2-26 19:48
写了个递归的:

不错不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-3 17:02:26 | 显示全部楼层
缘缘 发表于 2013-2-26 19:48
写了个递归的:

老哥红色部分应该是SIZE-1吧,或者你初始化设置11个数值
int flag = refind(data,0,SIZE,num);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-3 17:14:53 | 显示全部楼层
雪是梅之香 发表于 2015-1-19 10:29
现在才学习,附上我的代码:

这个写得比较准确,尤其是result=find(num,0,10,n)是10而不是11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-22 09:49:16 | 显示全部楼层
大家很厉害,后来者精益求精
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 10:04:42 | 显示全部楼层
I love FishC.com!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-10 21:22:43 | 显示全部楼层
回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-25 14:56:27 | 显示全部楼层
本帖最后由 kyrie_wx 于 2020-4-25 15:04 编辑

int HalfSearch( int str[], int low,int high, int key )
{
        if(low>high)
                return -1;
               
        int mid = (low+high)/2;
       
        if(str[mid] == key)
        {
                return mid;
        }
        else if(str[mid]<key)
        {
                HalfSearch(str,mid+1,high,key);
        }
        else if(str[mid]>key)
        {
                HalfSearch(str,low,mid-1,key);
        }
        else
        {
                return -1;
        }
       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 23:06:57 | 显示全部楼层
#include <stdio.h>

int binary_search(int (*str)[],int value,int start,int end){


    if(value < (*str)[start] || value > (*str)[end]){
        return -1;
    }


    int mid = (end + start)/2;

    if((*str)[mid] ==  value){
        return mid;
    }

    if(start ==  end){
        return -1;
    }

    if((*str)[mid] < value){
        return binary_search(str,value,mid+1,end);
    }

    if((*str)[mid] > value){
        return binary_search(str,value,start,mid-1);
    }
    return -1;
}



int main(){

        int value,addr;
        int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};

        printf("请输入一个数字:");
        scanf("%d",&value);

        addr = binary_search(&str,value,0,10);
        if(addr != -1)
        {
            printf("%d 在str的%d\n",value,addr);

        }
        else
        {
            printf("%d 不在数组中!\n",value);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-26 22:48:48 | 显示全部楼层
YYB 发表于 2013-2-27 12:56
我有个问题,如果mid的值不是整数怎么弄啊?比如LOW = 0 High = 9,MID =4.5 这个时候怎么办啊?str[4.5]不 ...

整形啊,str[4.5]就是str[4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-28 11:54:30 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

int search(int str[],int low,int high,int key)
{
    int mid;
    mid = (low+high)/2;
    if( str[mid] == key )
    {
        return mid;
    }
    else if( str[mid] < key )
    {
        if(low==high && str[mid]!=key)
        {
            return -1;
        }
        search(str,mid+1,high,key);
    }
    else if( str[mid] > key )
    {
        if(low==high && str[mid]!=key)
        {
           return -1;
        }
        search(str,low,mid-1,key);
    }
}
int main()
{
    int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
    int n,low,high,mid;
    printf("输入你要查找的关键字: ");
    scanf("%d",&n);
    low=0;
    high=10;
    mid=search(str,low,high,n);
    if(mid!=-1)
    {
        printf("查找的在数组的 %d 号元素",mid);
    }
    else
    {
        printf("查找不到!");
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 18:18:03 | 显示全部楼层
用递归实现

#include <stdio.h>

int binary_search(int str[], int low, int high, int k)
{
    int mid;
    if (low <= high)
    {
        mid = (low + high) / 2;
        if (str[mid] == k)
            return mid;
        else if (str[mid] > k)
        {
            return binary_search(str, mid - 1, low, k);
        }
        else
        {
            return binary_search(str, mid + 1, high, k);
        }
    }
    else
        return 0;
}

int main()
{
    int str[8] = {1, 2, 3, 4, 5, 8, 13, 21};
    int n, i, addr;

    printf("数组的为!\n");
    for (i = 0; i < 8; i++)
    {
        printf("%d ", str[i]);
    }
    printf("\n");
    printf("请输入待查找的关键字:");
    scanf("%d", &n);

    addr = binary_search(str, 0, 7, n);
    if (-1 != addr)
    {
        printf("查找成功,关键字%d所在的位置为%d\n", n, addr + 1);
    }
    else
    {
        printf("查找失败!\n");
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表