您的位置:首页 > 其它

将数组中的所有元素依次循环右移k个位置

2013-05-31 23:21 603 查看
原题:请设计一个时间复杂度为O(n),空间复杂度不超过O(2)的算法,该算法将数组array[0:n-1]中所有元素依次循环右移k个位置。

算法思想:以一个元素为起点,用pre_temp记下其值,然后将其右边相距k位的元素与其交换,再移动到下一个k位,继续下去,直到回到起点。注注意回到起点并不一定表示移动

结束。显然每交换一次只有一个数据到位,所以程序中用 m 记下交换的次数,当 m=n 时表明所有数据到位。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define SIZE 10
void rightshift(int array[],int n,int k);	//右移函数的原型声明
void main()
{
int array[SIZE],i,k;
for(i=0;i<SIZE;i++)
{
array[i]=rand()%100+1;
}
printf("Before shifed,the array's elements are :\n");
for(i=0;i<SIZE;i++)
{
printf("%d	",array[i]);
}
printf("please input a number:\n");
scanf("%d",&k);
rightshift(array,SIZE,k);	//调用右移函数
printf("After shifed,the array's elements are :\n");
for(i=0;i<SIZE;i++)
{
printf("%d	",array[i]);
}
printf("\n");
}
void rightshift(int array[],int n,int k)
{
int p,q,pre_temp,m,temp;
p=0;
m=0;
q=p;
pre_temp=array[p];
while(m<n)	//每次移动只有一个数据到位,这里用m记下有多少个数据已到位
{
do
{
q=(q+k)%n;
temp=pre_temp;
pre_temp=array[q];
array[q]=temp;
m++;
}while(p!=q);
if(m<n)
{
++p;
q=p;
pre_temp=array[p];
}
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组 元素 循环 右移
相关文章推荐