| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 824 人关注过本帖, 1 人收藏
标题:请教一个问题更优的算法
只看楼主 加入收藏
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:11 
请教一个问题更优的算法
我个人是这样想的:
    先将要输入的所有坐标存到一个结构数组(结构含有序号,横坐标,纵坐标)中,然后再遍历所有结构数组,对每个结构按x,y的情况用选择排序法进行排序,最后再遍历所有结构数组依次输出其中的序号。但觉得这样做既耗时间有耗内存,请问各位大神能没有更好的思路或解法,麻烦指点一下,谢谢

这是题目的内容:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册







-------------------------------------------------------------------------------------------------------------------------------------------------------

[ 本帖最后由 ma815841356 于 2015-5-10 16:07 编辑 ]
2015-05-10 15:13
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
你还是按你的想法实现算法再谈优化吧。
楼主还是要理清几点思路的:
1,数据源作为排序的依据,必须存储,这不是耗内存
2,是否耗时间取决于算法,排序算法里比较耗时的是数据交换,而遍历数组是比较省时也是必须的。
3,你这题需要申请动态数组
4,只要输出序号则可在序号上做手脚,不需要数据交换,肯定比选择法排序优化(选择法最终也要交换数据)

能编个毛线衣吗?
2015-05-10 16:16
yu1543054075
Rank: 1
等 级:新手上路
帖 子:102
专家分:8
注 册:2015-4-30
收藏
得分:0 
#include<stdio.h>
#define MAX 100
struct node
{
    int a;//序号
    int x;//横坐标
    int y;//纵坐标
}s[MAX];
int main(void)
{
    int N,i,j,t;
   
    printf("please input N integer numbers:\n");
    scanf("%d",&N);
    printf("请输入它们的序号以及它们的横纵坐标:\n");
    for(i=1;i<=N;i++)
        scanf("%d%d%d",&(s[i].a),&(s[i].x),&(s[i].y));
    for(i=1;i<=N-1;i++)
        for(j=i+1;j<=N;j++)
        {
            if(s[i].x>s[j].x)
            {
                t=s[i].a;
                s[i].a=s[j].a;
                s[j].a=t;
            }
            else if(s[i].x==s[j].x)
            {
                if(s[i].y>s[j].y)
                {
               
                    t=s[i].a;
                    s[i].a=s[j].a;
                    s[j].a=t;
                }
            }
        }
        for(i=1;i<=N;i++)
            printf("%d ",s[i].a);
}



        
但是结果不对,不知道哪里出错了
2015-05-10 17:19
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
你这是冒泡法,你只交换了序号,作为比较的主体没交换有什么用?再就是你恰恰使用了最浪费内存、最耗时的算法。按你的算法修改如下即正常:
程序代码:
#include<stdio.h>
#define MAX 100
struct node
{
    int a;//序号
    int x;//横坐标
    int y;//纵坐标
}s[MAX];
int main(void)
{
    int N,i,j;
    printf("please input N integer numbers:\n");
    scanf("%d",&N);
    printf("请输入它们的序号以及它们的横纵坐标:\n");
    for(i=1;i<=N;i++)
        scanf("%d%d%d",&(s[i].a),&(s[i].x),&(s[i].y));
    for(i=1;i<=N-1;i++)
        for(j=i+1;j<=N;j++)
        {
            if(s[i].x>s[j].x||(s[i].x==s[j].x&&s[i].y>s[j].y))
            {
                s[0]=s[i];
                s[i]=s[j];
                s[j]=s[0];
            }
        }
        for(i=1;i<=N;i++)
            printf("%d ",s[i].a);
        return 0;
}


 

能编个毛线衣吗?
2015-05-10 17:54
yu1543054075
Rank: 1
等 级:新手上路
帖 子:102
专家分:8
注 册:2015-4-30
收藏
得分:0 
4楼的可以给一个更有效率的算法吗
2015-05-10 18:48
yu1543054075
Rank: 1
等 级:新手上路
帖 子:102
专家分:8
注 册:2015-4-30
收藏
得分:0 
我还是不太明白,我把它们的序号交换不也行吗,因为只要输出它们的序号不就行了吗,为什么只交换序号就不对了呢
2015-05-10 19:10
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
收藏
得分:0 
回复 3楼 yu1543054075
你这样单单交换它们的序号而没有让它们的x,y一起随着交换的话,会导致后面的比较中x,y与它此时的序号不对应。
2015-05-10 20:02
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

剑栈风樯各苦辛,别时冰雪到时春
2015-05-10 21:23
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
收藏
得分:0 
回复 4楼 wmf2014
你好,这是我自己写的代码,但提交后是Time Limit Exceeded ,麻烦指点一下其中可以优化的地方,谢谢

#include<stdio.h>
#include<stdlib.h>
struct zuobiao
{
    int xuhao;
    int x;
    int y;
};

int main()
{
    int n,i,t;

    struct zuobiao *p;

    scanf("%d",&n);

    p=(struct zuobiao*)malloc((n+1)*sizeof(struct zuobiao));

    for(i=1;i<=n;i++)
    {
        scanf("%d%d%d",&(p+i)->xuhao,&(p+i)->x,&(p+i)->y);
    }

    for(i=1;i<n;i++)
        for(t=i+1;t<=n;t++)
    {
        if(((p+i)->x)>((p+t)->x)||((p+i)->x)==((p+t)->x)&&((p+i)->y)>((p+t)->y))
        {
            p[0]=p[i];
            p[i]=p[t];
            p[t]=p[0];
        }
    }

    for(i=1;i<=n;i++)
        printf("%d ",(p+i)->xuhao);

    printf("\n");
   
    return 0;
}
2015-05-10 23:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
排序算法的效率不够。使用快排或堆排。

重剑无锋,大巧不工
2015-05-11 08:10
快速回复:请教一个问题更优的算法
数据加载中...
 
   



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

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