顺序表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); }