一、顺序表逆置基本逻辑和实现
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);
}