鱼C论坛

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

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

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

  3. int bin_search( int str[], int low, int high, int key )
  4. {
  5.         if( low > high )
  6.         {
  7.                 return -1;
  8.         }
  9.        
  10.         int mid = ( low + high )/2;
  11.        
  12.         if( str[mid] == key )
  13.         {
  14.                 return mid;
  15.         }
  16.         else if( str[mid] < key )
  17.         {
  18.                 bin_search( str, mid+1, high, key );
  19.         }
  20.         else if( str[mid] > key )
  21.         {
  22.                 bin_search( str, low, mid-1, key );       
  23.         }
  24.        
  25. }

  26. int main()
  27. {
  28.        
  29.         int str[11]={1,2,3,4,5,6,7,8,9,10,11};
  30.         int add,n,low,high;
  31.        
  32.         low=0;
  33.         high=11-1;
  34.        
  35.         cout<<"please input search number:";
  36.         cin>>add;
  37.        
  38.         n = bin_search( str, low, high, add );
  39.        
  40.         cout<<"search success!"<<endl;
  41.         cout<<"search number:"<<add<<" ,"<<"locate:"<<n<<endl;
  42.        
  43.         return 0;
  44. }
复制代码

交个作业,有参考楼上的同学,勿怪!
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int search(int str[],int low,int high,int key)
  4. {
  5.     int mid;
  6.     mid = (low+high)/2;
  7.     if( str[mid] == key )
  8.     {
  9.         return mid;
  10.     }
  11.     else if( str[mid] < key )
  12.     {
  13.         if(low==high && str[mid]!=key)
  14.         {
  15.             return -1;
  16.         }
  17.         search(str,mid+1,high,key);
  18.     }
  19.     else if( str[mid] > key )
  20.     {
  21.         if(low==high && str[mid]!=key)
  22.         {
  23.            return -1;
  24.         }
  25.         search(str,low,mid-1,key);
  26.     }
  27. }
  28. int main()
  29. {
  30.     int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
  31.     int n,low,high,mid;
  32.     printf("输入你要查找的关键字: ");
  33.     scanf("%d",&n);
  34.     low=0;
  35.     high=10;
  36.     mid=search(str,low,high,n);
  37.     if(mid!=-1)
  38.     {
  39.         printf("查找的在数组的 %d 号元素",mid);
  40.     }
  41.     else
  42.     {
  43.         printf("查找不到!");
  44.     }
  45.     return 0;
  46. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-25 21:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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