左右移动(旋转)数组元素

发布于:2023-01-04 ⋅ 阅读:(221) ⋅ 点赞:(0)

系列目录​​​​​​​

判断数组的某一个元素的数量是否超过了整个数组数量的一半

查找两个升序数组的中间数

二分折半查找插入元素

合并两个有序顺序表到新表

删除有序顺序表重复元素

 顺序表逆置

文图介绍

数组数据实现左旋转右选转,如12345,左旋转1步得23451。或右选转3步得34512

示例:

数组A
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-                                      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

总结

以上就是本章要讲的内容,本文仅仅简单介绍了数组旋转的实现,提供了能使我们快速便捷地思路和方法。



网站公告

今日签到

点亮在社区的每一天
去签到