举个例子
?思路很简单,移就完事了
法1:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void Print(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%-3d ", arr[i]);
}
}
void Shift_Left(int *arr, int n) //左移一位
{
assert(arr != NULL);
if (n <= 1)
{
return;
}
int tmp = arr[0];
for (int i = 0; i < n; ++i)
{
arr[i] = arr[i + 1];
}
arr[n - 1] = tmp;
}
void Shift_Right(int *arr, int n) //右移一位
{
assert(arr != NULL);
if (n <= 1)
{
return;
}
int tmp = arr[n-1];
for (int i = n - 1; i > 0; --i)
{
arr[i] = arr[i - 1];
}
arr[0] = tmp;
}
//左移k位
void Shift_Left_k(int *arr, int n, int k)
{
assert(arr != NULL);
if (n <= 1)
{
return;
}
k = k%n; //向左移动n位,等于移了0位
if (k > 0)
{
while (k--)
{
Shift_Left(arr, n);
}
}
else //k<0向左移动为负,相当于右移
{
while (k++)
{
Shift_Right(arr, n);
}
}
}
//右移K位,相当于左移-k位
void Shift_Right_k(int *arr, int n, int k)
{
Shift_Left_k(arr, n, -k);
}
int main()
{
int arr[] = { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 };
int n = sizeof(arr) / sizeof(arr[0]);
Shift_Right_k(arr, n, 3);
Print(arr, n);
system("pause");
return 0;
}
左移3位:
?右移3位:
?
法二:
思路如图所示:
?三步法:
先将前k位交换,再将k位之后的交换
最后整体交换
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void Swap(int *arr,int left, int right)
{
int tmp = 0;
while (left < right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
void Three_Step_Left(int *arr, int n, int k)
{
assert(arr != NULL);
if (n <= 1)
{
return;
}
k = k%n;
if (k > 0)
{
Swap(arr, 0, k - 1);
Swap(arr, k, n - 1);
Swap(arr, 0, n - 1);
}
else
{
k = -k;
Swap(arr, n - k, n - 1);
Swap(arr, 0, n - k - 1);
Swap(arr, 0, n - 1);
}
}
void Three_Step_Right(int *arr, int n, int k)
{
Three_Step_Left(arr, n, -k);
}
void Print(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%-3d ", arr[i]);
}
}
int main()
{
int arr[] = { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 };
int n = sizeof(arr) / sizeof(arr[0]);
Three_Step_Left(arr, n, 3);
Print(arr, n);
system("pause");
return 0;
}
?不管移动几位,只移动n次
左移4位:
?右移4位:
?
法三:
结构之法
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#define N 10
struct Shift_Arr
{
int arr[N];
int index;
int maxsize;
};
int Get_Elem(const struct Shift_Arr *par, int pos) //得到pos下标的元素
{
if (par == NULL || pos < 0 || pos >= par->maxsize)
{
exit(1);
}
return par->arr[(par->index + pos) % par->maxsize];
}
void Shift_Left(struct Shift_Arr *par, int k) //左移k位
{
assert(par != NULL && k>0);
k = k%par->maxsize;
par->index = par->index + k;
}
int main()
{
int k = 0;
printf("请输入左移几位!\n");
scanf("%d", &k);
struct Shift_Arr Arr = { { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 }, 0, N };
Shift_Left(&Arr, k);
for (int i = 0; i < N; i++)
{
printf("%d ", Get_Elem(&Arr, i));
}
system("pause");
return 0;
}
?
?对这段代码稍作分析:
?
?
思路:
充分利用了%取模运算符,如果pos=4,会从第五个元素开始打印,当i+pos等于 maxsize时,此时再模上maxsize,又从第一个元素开始打印,直到 i==N时退出循环,此时所有元素都被打印过了
?
|