2 international470 international470 于 2016.04.30 10:37 提问

C语言--折半法的问题,求大神指点

对于某公司的职工进行工资排序,且用折半法找到指定的职工

#include<string.h>
#define M 3
void inputName(char name[][121],double money[]);
void ouput(char name[][121],double money[]);
void sortPay(char name[][121],double money[]);
void sortName(char name[][121],double money[]);
int zhe(char name[][121],double money[]);
void main()
{
    char name[M][121];
    double money[M]={0};
    char m[121];
    int g;
    inputName(name,money);
    printf("输出原样:\n");
    ouput(name,money);
    sortPay(name,money);
    printf("按工资输出:\n");
    ouput(name,money);
    sortName(name,money);
    printf("按姓名输出:\n");
    ouput(name,money);
    printf("请输入要查找的职工姓名:");
    gets(m);
    g=zhe(name,money,m);
    if(g!=-1)
    {
        printf("输出该职工%s\n",m);
    }
    else
    {
        printf("没有此人\n");
    }

}
//写一个函数,输入m个职工的姓名和工资
void inputName(char name[][121],double money[])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("输出职工姓名:");
        scanf("%s",&name[i]);
        printf("输入职工工资:");
        scanf("%lf",&money[i]);
        getchar();
    }
    printf("\n");
}
//写一个函数,输出m个职工的姓名和工资
void ouput(char name[][121],double money[])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("%s   %g\n",name[i],money[i]);
    }
}
//写一个函数,对m个职工的工资进行升序排列,姓名也随着调整
void sortPay(char name[][121],double money[])
{
    int i,j;
    double t;
    char x[121];
    for(i=1;i<M;i++)
    {
        for(j=0;j<M-i;j++)
        {
            if(money[j]<money[j+1])
            {
                t=money[j];
                money[j]=money[j+1];
                money[j+1]=t;
                strcpy(x,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],x);
            }
        }
    }
}
//写一个函数,对m个职工的姓名进行升序排列,工资也随着调整
void sortName(char name[][121],double money[])
{
    int i,j;
    char xm[121];
    double t;
    for(i=1;i<M;i++)
    {
        for(j=0;j<M-i;j++)
        {
            if(strcmp(name[j],name[j+1])<0)
            {
                strcpy(xm,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],xm);
                t=money[j];
                money[j]=money[j+1];
                money[j+1]=t;
            }
        }
    }
}
//写一个函数,findByName,用折半法按姓名查找指定的职工,找到返回数组下标,找不到返回-1
int zhe(char name[][121],double money[],char m[])
{
    int top,bottom,mid;
    top=0;
    bottom=M-1;
    mid=(top+bottom)/2;
    while(top<=bottom)
    {
        mid=(top+bottom)/2;
        if(strcmp(m,name[mid][121])<0)
        {
            top=mid+1;
        }
        else if(strcmp(m,name[mid][121])>0)
        {
            bottom=mid-1;
        }
        else
        {
            return mid;
        }

    }
    return -1;
}


3个回答

qq423399099
qq423399099   Ds   Rxr 2016.04.30 10:53
已采纳

zhe函数里两个strcmp应该都改为strcmp(m,name[mid])<0

 #include<string.h>
#include<stdio.h>
#define M 3
void inputName(char name[][121],double money[]);
void ouput(char name[][121],double money[]);
void sortPay(char name[][121],double money[]);
void sortName(char name[][121],double money[]);
int zhe(char name[][121],double money[],char m[]);
void main()
{
    char name[M][121];
    double money[M]={0};
    char m[121];
    int g;
    inputName(name,money);
    printf("输出原样:\n");
    ouput(name,money);
    sortPay(name,money);
    printf("按工资输出:\n");
    ouput(name,money);
    sortName(name,money);
    printf("按姓名输出:\n");
    ouput(name,money);
    printf("请输入要查找的职工姓名:");
    gets(m);
    g=zhe(name,money,m);
    if(g!=-1)
    {
        printf("输出该职工%s\n",m);
    }
    else
    {
        printf("没有此人\n");
    }

}
//写一个函数,输入m个职工的姓名和工资
void inputName(char name[][121],double money[])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("输出职工姓名:");
        scanf("%s",&name[i]);
        printf("输入职工工资:");
        scanf("%lf",&money[i]);
        getchar();
    }
    printf("\n");
}
//写一个函数,输出m个职工的姓名和工资
void ouput(char name[][121],double money[])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("%s   %g\n",name[i],money[i]);
    }
}
//写一个函数,对m个职工的工资进行升序排列,姓名也随着调整
void sortPay(char name[][121],double money[])
{
    int i,j;
    double t;
    char x[121];
    for(i=1;i<M;i++)
    {
        for(j=0;j<M-i;j++)
        {
            if(money[j]<money[j+1])
            {
                t=money[j];
                money[j]=money[j+1];
                money[j+1]=t;
                strcpy(x,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],x);
            }
        }
    }
}
//写一个函数,对m个职工的姓名进行升序排列,工资也随着调整
void sortName(char name[][121],double money[])
{
    int i,j;
    char xm[121];
    double t;
    for(i=1;i<M;i++)
    {
        for(j=0;j<M-i;j++)
        {
            if(strcmp(name[j],name[j+1])<0)
            {
                strcpy(xm,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],xm);
                t=money[j];
                money[j]=money[j+1];
                money[j+1]=t;
            }
        }
    }
}
//写一个函数,findByName,用折半法按姓名查找指定的职工,找到返回数组下标,找不到返回-1
int zhe(char name[][121],double money[],char m[])
{
    int top,bottom,mid;
    top=0;
    bottom=M-1;
    mid=(top+bottom)/2;
    while(top<=bottom)
    {
        mid=(top+bottom)/2;
        if(strcmp(m,name[mid])<0)
        {
            top=mid+1;
        }
        else if(strcmp(m,name[mid])>0)
        {
            bottom=mid-1;
        }
        else
        {
            return mid;
        }

    }
    return -1;
}

图片说明

international470
international470 回复小灸舞:谢谢大神,你太棒了!!!
一年多之前 回复
qq423399099
qq423399099 回复International470: zhe函数里两个strcmp(m,name[mid][121])应该都改为strcmp(m,name[mid])
一年多之前 回复
international470
international470 大神,你改了什么?居然做出来了,好厉害!!!
一年多之前 回复
ljheee
ljheee   Rxr 2016.04.30 10:45

折半法---只适用于 有序序列的排序

http://download.csdn.net/detail/ljheee/9467218

international470
international470   2016.04.30 11:03

图片说明
还是没看出来~~~

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!