| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 499 人关注过本帖, 1 人收藏
标题:折半查找法,帮看看哪里错了,
只看楼主 加入收藏
zijinmaoyi
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-10-10
结帖率:0
收藏(1)
 问题点数:0 回复次数:6 
折半查找法,帮看看哪里错了,
输入要查找的数字x后没反应
#include <stdio.h>

int main(int argc, char *argv[])
{
    int i,j,t,n,x,w,a[100000];
    printf("请输入n的值:\n");
    scanf("%d",&n);
    printf("请输入n个正整数:\n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    printf("先对数组a进行排序:\n");
    for(j=0;j<n-1;j++)
        for(i=0;i<n-1-j;i++)
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
    printf("%d个数由小到大排序为:\n",n);
    for(i=0;i<n;i++)
    printf("%d,",a[i]);
    printf("\n");
    printf("请输入要查找的数字:\n");
    scanf("%d",&x);
    for(i=n/2;i>=0;i<n)
    {
        if(x==a[i])
        {
            w=i+1;
        }
        else
        if(x<a[i])
        {
            i=n/2-1;
        }
        else  i=n/2+1;
    }
    printf("%d的位置是第%d个。",x,w);
    return 0;
}
搜索更多相关主题的帖子: 折半 
2010-10-10 16:32
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-10 17:13
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
>>> HalfSearch 名字不好
最好是BinarySearch
如果是查找一个数属于那个数组的哪个区间,那么这个二分就没那么容易写正确了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-10 17:20
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-10 17:24
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:0 
我帮你改了一下
程序代码:
#include <stdio.h>

int main(int argc, char *argv[])
{
    int t,n,x,w=-1,a[100000];
    printf("请输入n的值:\n");
    scanf("%d",&n);
    printf("请输入n个正整数:\n");
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    printf("先对数组a进行排序:\n");
    for(int j=0;j<n-1;j++)
        for(int i=0;i<n-1-j;i++)
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
    printf("%d个数由小到大排序为:\n",n);
    for(int i=0;i<n;i++)
    printf("%d,",a[i]);
    printf("\n");
    printf("请输入要查找的数字:\n");
    scanf("%d",&x);
    for(int i=n/2;i>=0;i<n)
    {
        if(x==a[i])
        {
            w=i+1;
            break;
        }
        else if(x<a[i])
        {
            i=n/2-1;
        }
        else
            i=n/2+1;
    }
    if(w==-1)
        printf("不存在");
    else
       printf("%d的位置是第%d个。",x,w);
    return 0;
} 


声明一下:你写的查找不是二分查找!!你只是从中间开始查找而已

If You Want Something, Go Get It, Period.
2010-10-10 17:40
zijinmaoyi
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-10-10
收藏
得分:0 
谢谢cacker提供的函数!
修改后如下:

第一种
#include <stdio.h>

int main(int argc, char *argv[])
{
    int HalfSearch(int array[], int nLength, int value);
    int i,j,t,n,x,w,a[100000];
    printf("请输入n的值:\n");
    scanf("%d",&n);
    printf("请输入n个正整数:\n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    printf("先对数组a进行排序:\n");
    for(j=0;j<n-1;j++)
        for(i=0;i<n-1-j;i++)
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
    printf("%d个数由小到大排序为:\n",n);
    for(i=0;i<n;i++)
    printf("%d,",a[i]);
    printf("\n");
    printf("请输入要查找的数字:\n");
    scanf("%d",&x);
    w=HalfSearch(a, n, x);
    if(w>=0)
    {
        printf("%d的位置是第%d个。",x,w);
    }
    else
    {
        printf("错误!");
    }
    return 0;
}
//功能: 折半查找法   注:必须先排序 并且是升序
//参数: arrary 目的数组, nLength数组长度, value 要查找的数据
//返回: 如果有这个数组,就返回在数组里的位置,如果没有返回-1
int HalfSearch(int array[], int nLength, int value)
{
    int nIndex =-1;                    
    int mid = 0;                       //中间位置
    int left = 0;
    int right = nLength - 1;
   
    while(left <= right)
    {
        mid = (left + right)/2 ;      
        if ( value == array[mid])
        {
            nIndex = mid+1 ;
            break ;
        }
        else if (value < array[mid])
            right = mid - 1;
        else
            left = mid + 1;
    }
   
   
    return nIndex;
}




第二种
#include <stdio.h>

int main(int argc, char *argv[])
{
    int HalfSearch(int array[], int nLength, int value);
    int i,j,t,n,x,w,a[100000];
    printf("请输入n的值:\n");
    scanf("%d",&n);
    printf("请输入n个正整数:\n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    printf("先对数组a进行排序:\n");
    for(j=0;j<n-1;j++)
        for(i=0;i<n-1-j;i++)
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
    printf("%d个数由小到大排序为:\n",n);
    for(i=0;i<n;i++)
    printf("%d,",a[i]);
    printf("\n");
    printf("请输入要查找的数字:\n");
    scanf("%d",&x);
    int l=0,r=n-1;
    while(l<=r)
    {
        i=(l+r)/2;
        if(x==a[i])
        {
            w=i+1;
            break;
        }
        else
        if(x<a[i])
        {
            r=i-1;
        }
        else  l=i+1;
    }
    if(w>=0)
    {
        printf("%d的位置是第%d个。",x,w);
    }
    else
    {
        printf("错误!");
    }
    return 0;
2010-10-10 18:17
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
#include <stdio.h>

#include <stdlib.h>

#include<time.h>

void sort(int array[],int n)  //选择排序

 {

    int i,j,small,temp;

 

    for(i=0;i<n-1;i++)

    {

       small=i;

      for(j=i+1;j<n;j++)   //寻找关键字最小的数据元素

         if(array[j]<array[small])

            small=j; //记住最小元素的下标

       if(small!=i)  //最小下标不为i时交换元素

       temp=array[i];array[i]=array[small];array[small]=temp;

   

    }

 }

 int BSearch1(int a[],int x,int low,int high)

     //递归查找

 {

     int mid;

     if(low>high) return -1;

     mid=(low+high)/2;

     if(x==a[mid]) return mid;

     else if(x<a[mid])

     return BSearch1(a,x,low,mid-1);

     else

     return BSearch1(a,x,mid+1,high);

 

 }

 int BSearch2(int a[],int x,int l,int h)

     //非递归查找

 {

     int m;     

    while(l <= h)     

    {     

        m = (l + h) / 2;     

        if(a[m] == x) return m;     

        if(a[m] < x)         

            l= m + 1;     

        else         

            h= m - 1;            

    }     

    return -1;     

 

}

 

 

void main()

{

    int i,x,y,m,n;

    double dif;

    time_t start,end;

 

    int a[10000];

    for(i=0;i<10000;i++)

    a[i]= rand()%10000;

    sort(a,10000);

    printf("输入要查找数据(递归查找):");

    scanf("%d",&m);

    time(&start);

    x=BSearch1(a,m,0,9999);

    time(&end);

    dif=difftime(end,start);

    if(x==-1)

       printf("查找失败,该数据不存在!用时%f秒",dif);

        

   

    else

   

       printf("查找成功,下标为%d,用时%f秒",x,dif);

        

   

    printf("\n请输入要查找数据(非递归查找): ");

    scanf("%d",&n);

    time(&start);

    y=BSearch2(a,n,0,9999);

    time(&end);

    dif=difftime(end,start);

 

    if(y==-1)

   

       printf("\n查找失败,该数据不存在!用时%f秒\n",dif);

   

   

    else

   

       printf("\n下标位置为%d,用时%f秒\n",y,dif);

 

   

 

}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-10-10 18:50
快速回复:折半查找法,帮看看哪里错了,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057357 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved