您的位置:首页 > 理论基础 > 数据结构算法

数据结构题典007:顺序表中元素块的位置交换(ANSI C)

2011-12-26 00:20 716 查看
假设有顺序表 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 );
}
else if( m > n )
{
swap_block( c, l1, l1 + n - 1, l2, r2 );
swap_block( c, n, r1, l2, r2 );
}
else
{
swap_block( c, l1, r1, l2, l2 + m - 1 );
swap_block( c, l2, l2 + m - 1, l2 + m, r2 );
}
}

思路三:将原表整体逆序,然后再将两个元素块分别逆序。

void reverse_array( int c[], int low, int high )
{
int t;
assert( low <= high );
while( low < high )
{
t = c[low];
c[low] = c[high];
c[high] = t;
++low; --high;
}
}

void swap_block( int c[], int len, int m, int n )
{
reverse_array( c, 0, len - 1 );
reverse_array( c, 0, n - 1 );
reverse_array( c, n, len - 1 );
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: