题型一:假设一个表长为n的顺序表L中有两个分别为长度s子表S和长度为r子表R,S,R不相交。设计算法,实现S和R在L中的位置互换,并且互换后S和R的元素均为正序排列。
思想:先整个表进行逆转,然后对前面的子表进行逆转,最后对后面一个子表进行逆转。(例如:可以将两个子表看成12345abcde,对整个表进行逆转后为edbca54321,再对前面进行逆转为abcde54321,最后对后面进行逆转为abcde12345)
代码:
void swap(ElemType &a,ElemType &b){
int temp;
temp=a;
a=b;
b=temp
}
void reverse(Sqlist &L,int s,int e){
if(e>L.length) return;//反转顺序表的范围为s到e
while(s<e){//对称位置做交换
swap(L.data[s],L.data[e]);
s++;
e--;
}
}
bool exchage(Sqlist &L,int s,int n){
//if(L.length != n){
// return false;
//}
reverse(L,0,n-1);//逆转整个表
reverse1(L,0,s-1);//逆转前s个元素
reverse1(L,s,n-1);//逆转后n-s个元素
return true;
}
时间复杂度O(n);空间复杂度O(1)
题型二:假设一个表长为n的顺序表L中有两个分别为长度s子表S和长度为r子表R,S,R不相交。设计算法,实现S和R在L中的位置互换,并且互换后S和R的元素均为逆序排列。
思想:将两个子表看成一个表,对表中的元素进行交换。首先是1与n交换,然后对2和n-1进行交换,以此类推,直到不能交换为止。
void reverse(Sqlist &L){
int i=0;j=L.length-1;//开始时,i为顺序表的第一个元素 ,j为顺序表的最后一个元素
while(i<j){
ElemType t = L.data[i];
L.data[i] = L.data[j];
L.data[j] = t;
i++;
j--;
}
}
时间复杂度O(n);空间复杂度O(1)