|
发表于 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差距较大的时候我算法估计要快一点。 |
评分
-
查看全部评分
|