鱼C论坛

 找回密码
 立即注册
查看: 5110|回复: 19

[争议讨论] 算法一日一练 01

[复制链接]
发表于 2013-7-19 10:16:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在一维数组A[m+n]中顺序存放两个线性表(a1,  a2, a3, ... , am)和(b1, b2, b3, ... , bn),编写函数,将两个线性表位置互换,即将(b1, b2, b3, ... , bn)放在(a1,  a2, a3, ... , am)前面。
试着设计在时间及空间两方面都尽量高效的算法,并将想法及源码贴出来(语言不限,最好C/C++)。我将适量给予评分,希望大家踊跃参与。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +1 收起 理由
怡静 + 5 + 5 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-19 18:08:55 | 显示全部楼层
我负责顶贴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-19 19:53:47 | 显示全部楼层
路过。。得分。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-20 10:14:39 | 显示全部楼层
  1. void exchangelist(int *list,int m,int n)
  2. {
  3.         void exch(int *list , int i ,int j);
  4.         int i=0,j=m+n-1;
  5.         
  6.         exch(list,i,j);
  7.         
  8.     exch(list,i,n-1);
  9.         
  10.         exch(list,n,j);
  11.         
  12. }

  13. void exch(int *list , int i ,int j)
  14. {
  15.         int temp;
  16.         while (i<j)
  17.         {
  18.                 temp=*(list+i);
  19.                 *(list+i)=*(list+j);
  20.                 *(list+j)=temp;
  21.                 i++;
  22.                 j--;
  23.         }
  24. }
复制代码
基本思想:先把整个表倒序。例如a1-am  b1-bn 翻转得到bn-b1  am-a1  再将b表,a表依次翻转即可。


测试代码:
  1. #include <stdio.h>

  2. void exchangelist(int *list,int m,int n);

  3. void main()
  4. {
  5.         int list[20];
  6.     int i;
  7.         
  8.         for (i=0;i<20;i++)
  9.                 list[i]=i+1;
  10.         exchangelist(list,12,8);
  11.         printf("Exchange successfully!\n");
  12.         for (i=0;i<20;i++)
  13.                 printf("%3d",list[i]);
  14.         printf("\n");
  15. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
故乡的风 + 5 谢谢参与,算法正确,时空复杂度也比较小。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-3 08:43:52 | 显示全部楼层
路过...........................................
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-3 09:46:57 | 显示全部楼层
矮油,支持啊,搞算法的大神,你把小甲鱼拉着,我可以每天陪你一算!哈哈!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-3 09:47:40 | 显示全部楼层
路过,顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-3 10:14:25 | 显示全部楼层
算法不是太了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-3 12:23:19 | 显示全部楼层
要是能快点我就写楼上那个算法了,以前也看过,唉,为了完全摆脱这种逆序思维,真是麻烦,不知道楼主看看我这样的折叠然后进行加头加尾的方法有没有可能能够进一步的提高效率,而且我不要鱼币你给我点荣誉值哈,我要早点升到鱼油1.像楼主致敬,明天的算法帖子我要早点来了。
#include <iostream>
#define MIN(a,b)                a>b?b:a
#define MAX(a,b)        a>b?a:b
void sort(int* p,int m,int n);
void rush(int* p,int m,int n);
void addhead(int* p,int j,int k);
void addtail(int* p,int j,int k);
void display();
void main()
{       
int p[20]={0};
for(int i=0;i<20;i++)
p[i]=i+1;
for(int j=0;j<i;j++)
std::cout<<p[j]<<std::ends;
std::cout<<std::endl;
sort(p,8,12);
for(j=0;j<i;j++)
std::cout<<p[j]<<std::ends;
}
void sort(int* p,int m,int n)
{
rush(p,m,n);
if(m>n)
addhead(p,n,m);
else if(m<n)
addtail(p,n,m);
}
void rush(int* p,int m,int n)
{
int rep;
int a=MIN(m,n);
int b=MAX(m,n);
for(int i=0;i<a;i++)
{
rep=p[b+i];
p[b+i]=p[i];
p[i]=rep;
}
}
void addhead(int* p,int j,int k)
{
for(int q=j;q>0;q--)
{
int rep=p[j+k-1];
for(int i=k;i>0;i--)
{
        p[i+j-1]=p[i+j-2];
}
p[i+j]=rep;
}
}
void addtail(int* p,int j,int k)
{
for(int q=j-k;q>0;q--)
{
int rep=p[j-1];
for(int i=j-1;i>0;i--)
{
p[i]=p[i-1];
}
p[i]=rep;
}
}
思路:首先进行折叠,然后进行加尾,当m<n时进行加头。对于m=18,n=2。这样m n差距较大的时候我算法估计要快一点。

评分

参与人数 1荣誉 +10 贡献 +5 收起 理由
怡静 + 10 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 08:30:19 | 显示全部楼层
不错,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 09:03:20 | 显示全部楼层
路过!~拿点分回家
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 09:30:20 | 显示全部楼层
我这都是哪天了,赶不上了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-16 15:19:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-21 13:04:29 | 显示全部楼层
只是路过,看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-23 12:17:38 | 显示全部楼层
顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-23 14:27:56 | 显示全部楼层
唉  跟不上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-27 10:17:36 | 显示全部楼层
负责支持楼主!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-28 02:44:53 | 显示全部楼层
感谢楼主分享,突然发现:我适量给予评分
这样的话会导致拿分的多余讨论的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-29 22:53:26 | 显示全部楼层
Potato丶 发表于 2013-7-20 10:14
基本思想:先把整个表倒序。例如a1-am  b1-bn 翻转得到bn-b1  am-a1  再将b表,a表依次翻转即可。

厉害。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-7 14:00:54 | 显示全部楼层
厉害。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 19:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表