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

来源:互联网 发布:开源大数据调度系统 编辑:程序博客网 时间:2024/04/30 06:41

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