两个顺序表的位置互换&数组元素序列循环左移

这篇博客介绍了如何在一维数组中实现两个顺序表的位置互换,等价于数组元素的循环左移问题。提出了两种方法:整体代换法,通过临时数组实现;以及逆置法,通过三次逆置操作完成。提供了C++的完整代码实现,算法的时间复杂度为O(m+n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

在一维数组中将两个长度分别为m和n的线性表互换

题目要求

已知在一维数组[m+n]中依次存放两个线性表(a1,a2,…,am)和(b1,b2,…,bn),现要将这两个顺序表位置互换。
本题也可以理解为要将数组中的元素序列循环左移m个位置。

基本思想

第一种
将两个线性表各看成一个整体,用(T=A,A=B,B=T)的方法进行交换,这种方法思路非常简单好懂,但是执行起来比较麻烦,这里为了方便编程,直接令临时数组T的长度为m,算法空间复杂度为O(m);
第二种
用数组元素逆置的方法,假设A代表数组前m个元素,B代表数组余下的n个元素,那么这个问题实际上就是如何把数组AB换成BA。
对于数组AB,先将A逆置得到A-1B,再将B逆置得到A-1B-1。最后对整个数组进行逆置(A-1B-1)-1,即可得到BA。
举个例子,设函数Reverse执行数组元素逆置的操作,现在有一组数组[1,2,3,4,5,6,7,8],要循环左移3个元素。具体变化过程如下:
Reverse(0,2),得到[3,2,1,4,5,6,7,8];
Reverse(3,7),得到[3,2,1,8,7,6,5,4];
Reverse(0,7),得到[1,2,3,4,5,6,7,8]。
该算法中三个Reverse的时间复杂度分别为O(m/2)、O(n/2)、O(m+n/2),故时间复杂度为O(m+n),空间复杂度为O(1)。

核心代码

第一组

整体代换法

void Exchange(DataType A[], int m, int n, int arraySize)
{
   
	if (m + n != arraySize) return;
	DataType *B = new DataType[m];
	for (int i = 0; i < m; i++)
		B[i] = A[i];//提取出前m个元素
	for (int j = m; j < m + n; j++)
		A[j - m] = A[j];//后面n个元素前移
	for (int k = 0; k < m; k++)
		A[n + k]<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值