假设有顺序表 L.elem[] = { a_1, a_2, ..., a_m, | b_1, b_2, ..., b_n },设计算法将L的两部分元素互换,使得 L.elem[] = { b_1, b_2, ..., b_n, |a_1, a_2, ..., a_m }
思路一:循环移位,数组整体循环右移n个元素
void circ_right_shift( int c[], int len, int n )
{
int i, t;
while( n-- > 0 )
{
t = c[len - 1];
for( i = len - 2; i >= 0; --i )
c[i + 1] = c[i];
c[0] = t;
}
}
思路二:使用两个指针依次交换两个元素块的对应序元素,若两方剩余元素不等,则通过递归再做交换。
void swap_elem( int * a, int * b )
{
int t = *a;
*a = *b;
*b = t;
}
void swap_block( int c[], int l1, int r1, int l2, int r2 )
{
int m = r1 - l1 + 1, n = r2 - l2 + 1;
int i;
if( m == n )
{
for( i = 0; i < m; ++i )
swap_elem( c + l1 + i, c + l2 + i );
}
els