数据结构题典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个元素
思路二:使用两个指针依次交换两个元素块的对应序元素,若两方剩余元素不等,则通过递归再做交换。
思路三:将原表整体逆序,然后再将两个元素块分别逆序。
思路一:循环移位,数组整体循环右移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 ); }
相关文章推荐
- 数据结构——交换二叉树中所有结点的左右子树(所有结点换位置)
- 数据结构中静态顺序表的初始化、尾插、尾删、头插、头删、任意位置的插入及删除
- 王朝 数据结构之元素位置交换
- 【数据结构】顺序队列
- 数据结构——顺序表的创建及功能函数
- 数据结构之顺序表
- 第三周数据计算实现与顺序结构程序设计的程序(二)
- C语言实现顺序表-数据结构
- 数据结构之顺序查找(Sequential Search)
- C语言实验——交换两个整数的值(顺序结构)
- 数据结构实验之查找六:顺序查找
- 数据结构之顺序队列(优化版)
- 数据结构之C语言实现顺序表(SeqList)无主函数
- 数据结构之顺序表
- 数据结构实验之链表一:顺序建立链表
- 数据结构之顺序表2
- 【数据结构】(1)顺序表
- 顺序表-数据结构
- 顺序表应用4-2:元素位置互换之逆置算法(数据改进)
- 数据结构之:线性表的顺序表示和实现