| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 891 人关注过本帖
标题:初学者:一个2分法查找数字的代码!不知道错在哪2分法代码哪一段直接跳过不 ...
只看楼主 加入收藏
qweewqeee
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-6
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
初学者:一个2分法查找数字的代码!不知道错在哪2分法代码哪一段直接跳过不执行!求大神帮忙!
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
void add(int a[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        int x = i;
        for (int j = i + 1; j < n; j++)
        {
            if (a[x] > a[j])
            {
                x = j;
            }
        }
        if (x != i)
        {
            a[x] = a[x] - a[i];
            a[i] = a[x] + a[i];
            a[x] = a[i] - a[x];
        }
    }
}
void sjs(int a[], int n)
{
    int t = (int)time(NULL);
    srand(t);
    for (int i = 0; i < n; i++)
    {
        a[i] = rand()%1000;
        /*    printf("%d\n", a[i]);*/
    }
}
int erfen(int a[], int n, int b)
{
    for (int tou = 0, wei = n - 1, zhong = (n - 1) / 2; tou >= wei; zhong = (tou + wei) / 2)
    {
        if (a[zhong] == b)
            return zhong;
        else if (a[zhong] < b)
            tou = zhong + 1;
        else if (a[zhong] > b)
            wei = zhong - 1;
    }
    return -1;
}
void main()
{
    int a[1000];
    int b;
    sjs(a, 1000);
    add(a, 1000);
    for (int i = 0; i < 1000; i++)
    {
        printf("a[%d]=%d\n", i, a[i]);
    }
    scanf("%d", &b);
    if (a[erfen(a, 1000, b)] == b)
    {
        printf("已经找到该数");
    }
    else
    {
        printf("没有查找到该数请重新输入");
    }
    system("pause");
}
搜索更多相关主题的帖子: include 
2016-03-06 16:06
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:10 
程序代码:
int erfen(int a[], int n, int b)
{
    for (int tou = 0, wei = n - 1, zhong = (n - 1) / 2; tou >= wei; zhong = (tou + wei) / 2)
    {
        if (a[zhong] == b)
            return zhong;
        else if (a[zhong] < b)
            tou = zhong + 1;
        else if (a[zhong] > b)
            wei = zhong - 1;
    }
    return -1;  //if (a[erfen(a, 1000, b)] == b),a[-1]?????
}

   唯实惟新 至诚致志
2016-03-06 16:49
qweewqeee
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-6
收藏
得分:0 
回复 2楼 qq1023569223
如果找到 retune zhong;   找不到才返回-1
int erfen(int a[], int n, int b)
{
        for (int tou = 0, wei = n - 1, zhong = (n - 1) / 2; tou >= wei; zhong = (tou + wei) / 2)
        {
                if (a[zhong] == b)
                        return zhong;

                else if (a[zhong] < b)
                        tou = zhong + 1;
                else if (a[zhong] > b)
                        wei = zhong - 1;
        }
        return -1;
}
2016-03-06 17:01
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
就像是你那样也不妥,当找不到时-1就会出错。如果我没有想错,你是在add里面给数组排序,但为什么要那样写,看不懂啊。

   唯实惟新 至诚致志
2016-03-06 17:22
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
循环条件出错,for (int tou = 0, wei = n - 1, zhong = (n - 1) / 2; tou >= wei; zhong = (tou + wei) / 2)改为for (int tou = 0, wei = n - 1, zhong = (n - 1) / 2; tou < wei; zhong = (tou + wei) / 2)

另:if (a[erfen(a, 1000, b)] == b)虽然在返回-1的情况下数组越界,但不会导致程序出错崩溃,但这样使用不合理,万一a[-1]的值恰好是b的值就会导致误判,此句最佳写法是if (erfen(a, 1000, b) >= 0)

回复楼上的:二分搜索就是在有序的数据里查找,楼主排序没问题。

[此贴子已经被作者于2016-3-6 17:48编辑过]


能编个毛线衣吗?
2016-03-06 17:47
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
回复 5楼 wmf2014
是我大意了,没看出判断条件,只是排序看着好奇怪。

   唯实惟新 至诚致志
2016-03-06 17:52
qweewqeee
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-6
收藏
得分:0 
回复 5楼 wmf2014
谢了! 我是犯2了!for循环中间条件成立才循环!搞混了!谢谢了! 还不找出问题来我都准备把软件卸载重装了!自学真累啊!
2016-03-06 18:21
qweewqeee
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-6
收藏
得分:0 
回复 6楼 qq1023569223
自己看视频学的!没什么系统知识!是有点乱!正在努力学习中!
2016-03-06 18:25
qweewqeee
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-6
收藏
得分:0 
回复 5楼 wmf2014
刚刚试了下 tou < wei 这样会漏掉最前一个和最后一个 应该加个等号就完美了!后面那句已经引用你的了!再次感谢!
2016-03-06 18:42
快速回复:初学者:一个2分法查找数字的代码!不知道错在哪2分法代码哪一段直接跳 ...
数据加载中...
 
   



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

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