系列目录
文图介绍
数组数据实现左旋转右选转,如12345,左旋转1步得23451。或右选转3步得34512
示例:
1 | 2 | 3 | 4 | 5 |
左旋转1步
2 | 3 | 4 | 5 | 1 |
提示:这里右选转不是基于左旋转,而是基于原数据
右旋转3步
3 | 4 | 5 | 1 | 2 |
一、实现算法思想:
可以将数组A视为数组ab,n为数组长度,先将a逆置,后将b逆置,最后ab整体逆置。
左旋转
设Reverse函数执行将数组元素逆置的操作,对12345向左循环3(p)位置的过程如下:数组A
1 2 3 4 5 Reverse(0,p-1)得到32145
p-1
3 2 1 4 5 Reverse(p,n-1)得到32154
p n-1
3 2 1 5 4 Reverse(0,n-1)得到45123
n-1
4 5 1 2 3
右旋转
设Reverse函数执行将数组元素逆置的操作,对12345向右循环3(p)位置的过程如下:数组A
1 2 3 4 5 Reverse(0, n-p-1);得到21345
n-p-1
2 1 3 4 5 Reverse(a, n-p, n - 1)得到21543;
n-p n-1
2 1 5 4 3 Reverse(0,n-1)得到34512
n-1
3 4 5 1 2
二、实现代码
void Reverse(int R[], int from, int to) {
int temp;
for (int i = 0; i <= (from + to) / 2 - from; i++)//前后两两逆置
{
temp = R[i + from];
R[i + from] = R[to - i];
R[to - i] = temp;
}
}
//左旋转
bool Converse(int R[], int n, int p)
{
p = p % n;//防止超出旋转范围(12345-51234)
if (p <= 0)
{
return false;
}
Reverse(a, 0, p - 1);
Reverse(a, p, n - 1);
Reverse(a, 0, n - 1);
return true;
}
//右旋转
//bool Converse(int R[], int n, int p)
//{
// p = p % n;//防止超出旋转范围(12345-23451)
// if (p<=0)
// {
// return false;
// }
// Reverse(a, 0, n-p-1);
// Reverse(a, n-p, n - 1);
// Reverse(a, 0, n - 1);
// return true;
//}
2.运行结果
左:45123
右:34512
总结
以上就是本章要讲的内容,本文仅仅简单介绍了数组旋转的实现,提供了能使我们快速便捷地思路和方法。