| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2901 人关注过本帖
标题:折半查找法
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:10 
折半查找法
C程序设计第四版~
p219 15 课后习题
15 写几个函数:
1:输入10个职工的姓名和职工号
2:按职工号由小到大顺序排序,姓名排序也随之调整
3:要求输入一个职工号,用折半查找法找出该职工姓名,从主函数输入要查找的职工号,输出该职工姓名。

对折半查找法表示不懂~还有~折半查找法和二分法查找有什么区别?表示只会二分法查找~

还有~由于这是函数课后习题~还没讲到结构体~回帖的最好还是不要用结构体处理~

[此贴子已经被作者于2017-1-23 18:31编辑过]

搜索更多相关主题的帖子: C程序设计 二分法 结构体 姓名 最好 
2017-01-23 18:30
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:8 
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


配套的答案


我是硬件工程师
2017-01-23 19:01
白衣柳相
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:142
专家分:168
注 册:2016-12-23
收藏
得分:12 
宝宝自己回答啦,答案还是百度滴,不喜欢但是没有发现明显错误,可以编译成功,需要代码的可以搬走。
#define N 10
#include<stdio.h>
find(a,b)
int a[],b[];
{
    int i,j,s,t,c[N][2];
    for(i=0; i<N; i++)
    {
        c[i][1]=a[i];
        c[i][1]=i;
    }
    for(i=0; i<N; i++)
        for(j=0; j<N-i-1; j++)
            if(c[i][0]>c[i+1][0])
            {
                t=c[i][0];
                c[i][0]=c[i+1][0];
                c[i+1][0]=t;
                s=c[i][1];
                c[i][1]=c[i+1][1];
                c[i+1][1]=s;
            }
    for(i=0; i<N; i++)
        b[i]=c[i][1];
    return;
}

lookfor(h,k)
int h[],k;
{
    int i,j;
    for(i=0; i<N; i++)
        if(h[i]-k==0) j=i;
    return j;
}

int main()
{
    int number[N],x[N],i,j,u,p;
    char name[N][20];
    for(i=0; i<N; i++)
    {
        gets(name[i]);
        scanf("%d",&number[i]);
    }
    scanf("%d",&p);
    find(number,x);

    u=lookfor(number,p);
    for(i=0; i<N; i++)
    {
        printf("%d",number[i]);
        puts(name[x[i]]);
    }
    puts(name[x[u]]);
}

什么最重要,学习!!!! 我要你们无话可说!我想要的东西自己去拿
2017-01-23 20:19
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
可以~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-23 20:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 qdcs
这个可以~不过我的电脑坏了~手机看帖第二幅图不能放大~而且感觉代码较长~还是要自己消化一下好~还是谢啦~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-23 20:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 九转星河
结贴后发现耐心等等图片还是可以出来的~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-23 20:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
囧~突然发现3楼代码不够严谨~还是有时间自己手机苦逼敲敲~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-23 21:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
本来想写个新手版~不过高手病又犯了~~
除了不用结构体处理~感觉开挂的代码不少~

程序代码:
#include<stdio.h>
#include<string.h>
#define N 10
#define S(a) sizeof(a)/sizeof(a[0])

typedef void FUN(int a[],char b[][10]);
FUN input,sort,output;
FUN **P=NULL;

void (*COM[])()={input,sort,output};

void search(int n,int a[],char b[][10]);

void swap(int a[],char b[][10],int i,int j);

int main()
{
    
    int a[N]={0};
    char b[N][10]={0};
    
    int num=0;
    char ch=0;
    
    for (P=COM;P-COM<S(COM);++P)
        (**P)(a,b);
        
    do
   {
        fflush(stdin);
        
        printf("\ninput search num:");
        scanf("%d%*c",&num);
        search(num,a,b);
         
        printf("continue?input Y||N:");
        ch=getchar();
         
     }while (ch=='y'||ch=='Y');
     
     return 0;
}
void input(int a[],char b[][10])
{
    int i=0;
    for (i=0;i<N;i++)
    {
        printf("input num-%d--",i+1);
        scanf("%d%*c",&a[i]);
        
        printf("input name-%d--",i+1);
        scanf("%[^\n]%*c",b[i]);
        
        printf("\n");
    }
}

void sort(int a[],char b[N][10])
{
    int i=0;
    int j=0;
    int k=0;
    
    for (i=0;i<N;i++)
    {
        k=i;
        for (j=i;j<N;j++)
            if (a[k]>a[j])
                k=j;
                
        if (k!=i)
            swap(a,b,i,k);
    }
}

void output(int a[],char b[N][10])
{
    int i=0;
    for (i=0;i<N;i++)
        printf("%d\n%s\n\n",a[i],b[i]);
}
void swap(int a[],char b[][10],int i,int j)
{
    char s[N];
    
    a[i]^=a[j];
    a[j]^=a[i];
    a[i]^=a[j];
    
    strcpy(s,b[i]);
    strcpy(b[i],b[j]);
    strcpy(b[j],s);
}

void search(int n,int a[],char b[][10])
{
    int left=0;
    int right=N-1;
    int mid=0;
    
    do
    {
        mid=(left+right)/2;
        
        if (n==a[mid])
            {
                printf("%s\n",b[mid]);
                return ;
            }
            
         if (n>a[mid])
            left=mid+1;
        else 
            right=mid-1;
        
    }while (mid!=(left+right)/2);
    
    printf("Not found\n");
    
}


[此贴子已经被作者于2017-1-24 14:51编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-24 12:24
白衣柳相
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:142
专家分:168
注 册:2016-12-23
收藏
得分:0 
回复 8楼 九转星河

什么最重要,学习!!!! 我要你们无话可说!我想要的东西自己去拿
2017-01-24 12:35
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
原来自己把二分法查找的循环结束条件写错了~~
do{}while (mid!=(left+right)/2);

想不到判断死循环的方法能如此巧妙~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-24 13:19
快速回复:折半查找法
数据加载中...
 
   



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

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