这个算法的时间和空间复杂度怎么分析啊,
算法1
创造一个额外数组,用来存取移位的数据
#include<stdio.h>
int main()
{undefined
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int s[10];
int p;
scanf("%d", &p);
for(int i=0; i<p; i++)
s[i]=arr[i];
for(int i=p; i<10; i++)
arr[i-p]=arr[i];
for(int i=9,j=p; i>9-p; i--)
arr[i]=s[--j];
for(int i=0; i<10; i++)
printf("%3d", arr[i]);
return 0;
}
时间复杂度O(n),缺点:牺牲空间。
算法2
循环p次,每次把最前面的数移到最后面
#include<stdio.h>
int main()
{undefined
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int p;
scanf("%d", &p);
for(int i=0; i<p; i++){undefined
int temp=arr[0];
for(int j=1; j<10; j++)
arr[j-1]=arr[j];
arr[9]=temp;
}
for(int i=0; i<10; i++)
printf("%3d", arr[i]);
return 0;
}
时间复杂度:O(n^2),缺点:牺牲时间
前两种方法都不是特别好,随着时间的减少,空间的利用会增大。
其实很多时候,时间和空间都是此消彼长的。
算法3
先全反序,再以9-p与10-p为界限,分别对前后进行反序
#include<stdio.h>
int main()
{undefined
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int p;
scanf("%d", &p);
for(int i=0; i<5; i++){undefined
int temp=arr[i];
arr[i]=arr[9-i];
arr[9-i]=temp;
}
for(int i=0; i<(10-p)/2; i++){undefined
int temp=arr[i];
arr[i]=arr[9-p-i];
arr[9-p-i]=temp;
}
for(int i=0; i<p/2; i++){undefined
int temp=arr[9-i];
arr[9-i]=arr[10-i-p];
arr[10-p-i]=temp;
}
for(int i=0; i<10; i++)
printf("%3d", arr[i]);
return 0;
}
时间复杂度:O(n)
算法4
以p为间隔,分别往前移位,第一个数则移到最后相应的位置
#include<stdio.h>
int main()
{undefined
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int p;
scanf("%d", &p);
for(int i=0; i<p; i++){undefined
int temp=arr[i];
int pos=i;
while(pos<10){undefined
arr[pos]=arr[pos+p];
pos+=p;
}
arr[pos-p]=temp;
}
for(int i=9; i>9-10%p; i--){undefined
int temp=arr[9];
for(int j=8; j>9-p; j--)
arr[j+1]=arr[j];
arr[10-p]=temp;
}
for(int i=0; i<10; i++)
printf("%3d", arr[i]);
return 0;
}
时间复杂度:O(n^2),
你好,请用 ‘代码块’ 插入代码, 现在的代码可读性太差了。