| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 294 人关注过本帖
标题:折半法查找问题
收藏  订阅  推荐  打印
zzt_428
Rank: 2
等级:注册会员
帖子:135
积分:1524
威望:1
来自:南京师范大学
注册:2008-7-6
折半法查找问题

我初学编程,写了个程序,先对输入的数从大到小排序,然后用折半法查找其中一个数,但是如果输入的数如果有两个是相同的,这个程序只能返回第一个数的位置,请问各位前辈,怎么样改进才能使它能找到所有相同的数?

#include <stdio.h>
#define N 15
void main()
{
    int i,j,m,n,ch,flag,sign,mid,temp,local,head,end,a[N];
    printf("enter the element of array:\n");
    for(i=0; i<N; i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
        printf("\n");
    }
    for(i=0; i<N; i++)
        printf("%5d",a[i]);

    for(i=0; i<N-1; i++)
    {
        for(j=0; j<N-i-1; j++)
        {
            if(a[j]<a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    printf("the sorted number:\n");
    for(i=1; i<N; i++)
        printf("%5d",a[i]);
    printf("\n");


    flag=1;
    sign=1;
    while(flag)
    {
        local=0;
        head=0;
        end=N-1;
        printf("Enter the number you want to search:\n");
        scanf("%d",&n);
        if(n>a[head] || n<a[end])
            local=-1;
        while(1==sign && head<=end)
        {
            mid=(head+end)/2;
            if(n == a[mid])
            {
                local=mid;
                printf("We've found it!the location is %d",local-1);
                sign=0;
            }
            else
            {
                if(n>a[mid])
                    end=mid-1;
                else head=mid+1;
            }


        }
        if(sign || -1==local)
            printf("Number not found.\n");
        printf("Do you want to continue?(y/n)\n");
        scanf("%c",&ch);

        if('N'==ch || 'n'==ch)
            flag=0;


    }
}
2008-7-8 22:00
卧龙孔明
Rank: 12Rank: 12Rank: 12
等级:版主
帖子:3692
积分:38938
威望:47
注册:2006-10-13

...
这二分代码一般在5行以内吧....

为了中国软件工业的未来,有爱心的朋友请不要帮忙代做作业,或者至少是收费服务!如果您不需要钱,或者您不愿收费用于自己,请把收取的钱用于支援山区贫困学生…谢谢大家!
2008-7-9 08:07
himpo
Rank: 2
等级:注册会员
帖子:132
积分:1612
注册:2008-5-16

很简单啊,再对那个数的前后进行比较,如果还相等,就继续前进或后退比较,逐个返回。。
2008-7-9 08:26
崔园园
Rank: 2
等级:注册会员
帖子:54
积分:610
注册:2008-4-21

for(i=1; i<N; i++)
        printf("%5d",a[i]);
    printf("\n");

这里i应该是从0开始吧
2008-7-9 10:09
mingshendeshou
Rank: 1
等级:新手上路
帖子:14
积分:244
注册:2005-4-15

加一个标记,如果两个数不相等就改变标记,跳出循环。

天生我才必有用。
2008-7-9 10:24
共有 293 人关注过本帖
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.121188 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved