数据结构题典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 );}
- 数据结构题典007:顺序表中元素块的位置交换(ANSI C)
- 数据结构题典006:有序表中冗余元素的删除(ANSI C)
- 数据结构题典008:顺序表的合并(ANSI C)
- 数据结构题典017:从无序数据建立有序顺序表(ANSI C)
- 数据结构题典005:单链表的复制(ANSI C)
- 数据结构题典002:删除单链表中最大元素所在结点(ANSI C)
- 数据结构题典004:对单链表元素插入排序(ANSI C)
- 数据结构题典016:按递增次序输出单链表所有元素(ANSI C)
- 数据结构题典001:有序线性表的归并(ANSI C)
- 数据结构题典003:线性表的就地逆置/翻转(ANSI C)
- 数据结构题典015:部分循环链表的逆转(ANSI C)
- 顺序栈的实现(ANSI C)
- 《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)
- 王朝 数据结构之元素位置交换
- 顺序表元素的逆置式交换
- 2、(c++)顺序表的建立、输出、查找、按元素位置删除代码
- 数据结构—Problem C: 调整表中元素顺序(线性表)
- 数据结构题典018:三个有序单链表求交(ANSI C)
- win7中快速以管理员权限打开命令行窗口(链接型方法)
- mfc 获得应用系统运行时的绝对路径
- 正则表达式入门教程
- 数据结构题典006:有序表中冗余元素的删除(ANSI C)
- 使用jad查看Java的字节码指令
- 数据结构题典007:顺序表中元素块的位置交换(ANSI C)
- 数据结构学习笔记(2)指针和结构体复习
- ubuntu下关闭防火墙
- 2011.12.25 POJ1036 DP
- 黑马程序员_RandomAccessFile 类
- “自动呼叫”手机将使美国债权人讨债更给力~[译]
- PCI 中断路由机制
- 基于iOS的JavaFX:生或死?[译]
- 一个不错的js tab