顺序表2:顺序表的逆置

一、顺序表逆置基本逻辑和实现

1.顺序表逆置的逻辑

将顺序表丛中间一分为二。

如果这个顺序表元素个数为i;

让第一个元素和最后一个元素互换,
第二个和倒数第二个元素互换;

i/2个元素和第i/2+1个元素互换。
交换结束以后,这就是个逆序的表了。

2.代码实现

void Reverse(Sqlist &L) {
	int temp;//辅助变量
	//这里L.Length/2会自动保留整数部分,所以,如果是奇数就没有任何影响了
	for (i = 0; i < L.Length/2; i++){
		temp = L.data[i];
		//数组下标是丛0开始的,所以最后一个元素的下标为L.length-1而不是L.length
		L.data[i] = L.data[L.length - 1 - i];
		L.data[L.Length - 1 - i] = temp;
	}
}

二、顺序表逆置的应用

问题描述
有一个序列,有n个元素:
a1, a2, a3, …,an-k+1,…, an-2, an-1, an;
将这个序列的顺序表移动成下面这样:
an-k+1,…,an-2, an-1, an, a1, a2, a3…

其实有点像把这个顺序表的元素按顺序“滚动”k个单位

1.解决思路

进行两轮逆置
首先将这个顺序表分成两段

【a1, a2, a3, …ak】【ak+1, … ,an-2, an-1, an】

第一轮逆置,将中括号里的两段内容分别逆置结果如下

【ak…,a3, a2, a1】【an, an-1, an-2 ,…, ak+1】

第二轮逆置,对整个顺序表逆置,结果如下

【ak+1,…,an-2,an-1, an, a1, a2, a3, …ak】

OK,现在其实已经完成咱么最开始的目的了。

2.代码实现

void Reverse(int R[], int from, int to){
	//这个函数传入的参数为
	/*要逆置的数组
	 *要逆置这个数组那一段的开始下标from
	 *要逆置那一段的结束下标to
	 */
	 int i, temp;//temp为临时变量
	 for (i=0; i < (to - from + 1)/2; i++){
		temp = R[from+i];
		R[from+i] = R[to - i];
		R[to - i] = temp;
	}
}

void Converse(int R[], int k) {
	//n是这个顺序表的表长
	//k是我们要让这个表往前“滚动”n-k个单位
	int n = R.Length;
	Reverse(int R, 0, k-1);
	Reverse(int R, k, n-1);
	Reverse(int R, 0, n-1);
}
  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辛伯达岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值