最近看了那4本编程的资料,也来说下数组的循环移位,其实数组的循环移位和插入排序很像
①首先说说这个循环移位的算法
// ArrayLeft.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void RightShift(int* a,int N,int K)
{
while (K--)
{
int temp=a[N-1];
for (int i=N-2;i>=0;i--)
{
a[i+1]=a[i];
}
a[0]=temp;
}
}
void LeftShift(int* a,int N,int K)
{
while (K--)
{
int temp=a[0];
for (int i=1;i<N;i++)
{
a[i-1]=a[i];
}
a[N-1]=temp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={1,2,3,4};
int len=sizeof(a)/sizeof(int);
RightShift(a,len,1);
for (int i=0;i<len;i++)
{
cout<<a[i];
}
system("pause");
return 0;
}
// ArrayLeft.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void RightShift(int* a,int N,int K)
{
while (K--)
{
int temp=a[N-1];
for (int i=N-2;i>=0;i--)
{
a[i+1]=a[i];
}
a[0]=temp;
}
}
void LeftShift(int* a,int N,int K)
{
while (K--)
{
int temp=a[0];
for (int i=1;i<N;i++)
{
a[i-1]=a[i];
}
a[N-1]=temp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={1,2,3,4};
int len=sizeof(a)/sizeof(int);
RightShift(a,len,1);
for (int i=0;i<len;i++)
{
cout<<a[i];
}
system("pause");
return 0;
}
②仔细观察就会发现每次一个位置上的数字移动N位又还是回到自己的位置了所以左移K的情形和左移K=k%N的情形是一样的
所以为了提高算法的效率可以这样做
void RightShift(int* a,int N,int K)
{
K%=N;
while (K--)
{
int temp=a[N-1];
for (int i=N-2;i>=0;i--)
{
a[i+1]=a[i];
}
a[0]=temp;
}
}
void LeftShift(int* a,int N,int K)
{
K%=N;
while (K--)
{
int temp=a[0];
for (int i=1;i<N;i++)
{
a[i-1]=a[i];
}
a[N-1]=temp;
}
}
void RightShift(int* a,int N,int K)
{
K%=N;
while (K--)
{
int temp=a[N-1];
for (int i=N-2;i>=0;i--)
{
a[i+1]=a[i];
}
a[0]=temp;
}
}
void LeftShift(int* a,int N,int K)
{
K%=N;
while (K--)
{
int temp=a[0];
for (int i=1;i<N;i++)
{
a[i-1]=a[i];
}
a[N-1]=temp;
}
}