鱼C论坛

 找回密码
 立即注册
查看: 2814|回复: 7

那个......请问我的折半算法错在哪里

[复制链接]
发表于 2017-1-26 02:09:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>

int SearchElement(int *array,int n,int element)
{int first=0;
          int last=n;
                  while(first<=last)
        {
                int mid=(first+last)/2;
                if(array[element]>array[mid])
                {
                        first=mid+1;
                 }
                 else if(array[element]<array[mid])
                 {
                         last=mid-1;
                 }
                 else
                {
               
                return mid;
                 
            }
         
        }
           return -1;
          
      
}
int main()
{
        int m;
        int a[5]={3,2,46,4,7};
        m=SearchElement(a,4,4);
        printf("%d",m);
       
}
讲道理....我仔细检查了很多遍,觉得我的算法没写错啊,可是运行结果就是不对!!!还请大佬们帮忙看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-26 08:01:17 | 显示全部楼层
边界(最大、最小值),程序的行为,是>还是>=?,<还是<=?前面比较后的行为为何?
折半后的值?这些都查一下,相信有所获。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-26 10:29:41 | 显示全部楼层
折半算法成立的条件是首先要是具有一定规律的数字,比如从大到小,从小到大。你的题目根本就没有说清楚,上来就是一串代码。等你题目说清楚了,我再来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-26 13:32:36 | 显示全部楼层
超凡天赐 发表于 2017-1-26 10:29
折半算法成立的条件是首先要是具有一定规律的数字,比如从大到小,从小到大。你的题目根本就没有说清楚,上 ...

int main()
{
        int m;
        int a[5]={3,4,6,7,8};
        m=SearchElement(a,4,8);
        printf("%d",m);
       
},主函数应该是这个.....是想找到数组中一个元素,返回值是其在数组中位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-26 14:09:01 | 显示全部楼层
超凡天赐 发表于 2017-1-26 10:29
折半算法成立的条件是首先要是具有一定规律的数字,比如从大到小,从小到大。你的题目根本就没有说清楚,上 ...

#include<stdio.h>

int SearchElement(int *array,int n,int element)
{
int first=0;
          int last=n;
                  while(first<=last)
        {
                int mid=(first+last)/2;
                if(element>array[mid])
                {
                        first=mid+1;
                 }
                 else if(element<array[mid])
                 {
                         last=mid-1;
                 }
                 else
                {
               
                return mid;
                 
            }
         
        }
           return -1;
          
      
}
int main()
{
        int a[100],b,c,d,m;
        scanf("%d",&b);
        for(c=0;c<b;c++)
        {
                scanf("%d",&a[c]);
               
        }
        scanf("%d",&d);
        m=SearchElement(a,b,d);
        printf("%d",m);  
       
}
我已经知道问题在哪了....但是还是想请问下,如果我希望输入待查找的整数,可以多次查找,输入EOF查找结束。该怎么该程序才能实现输出EOF结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-26 17:54:54 | 显示全部楼层
十六是只仙 发表于 2017-1-26 14:09
#include

int SearchElement(int *array,int n,int element)

linux系统下,在输入回车换行后的空行位置,按 ctrl+d (先按ctrl键,不放,再按d键),windows系统下,在输入回车换行后的空行位置,按 ctrl+z,再回车确认。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-26 19:28:15 | 显示全部楼层
超凡天赐 发表于 2017-1-26 17:54
linux系统下,在输入回车换行后的空行位置,按 ctrl+d (先按ctrl键,不放,再按d键),windows系统下,在 ...

int main()
{
        int a[100],b,c,d,m;
        scanf("%d",&b);
        for(c=0;c<b;c++)
        {
                scanf("%d",&a[c]);
               
        }
       
        do
        {
        scanf("%d",&d);
        m=SearchElement(a,b,d);
        printf("%d",m);
   }while(d!=EOF);
}
为什么这样最后输出EOF时也不能退出循环??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-26 20:03:25 | 显示全部楼层
十六是只仙 发表于 2017-1-26 19:28
int main()
{
        int a[100],b,c,d,m;

我用的是Mac os,所以我没试过在windows下怎么输入EOF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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