1.1.算法描述
Even算法的过程描述如下
(1)求出最大的活动整数m
(2)交换m和其箭头所掼向的与其相信的整数。
(3)交换所有满足p>m的整数的p的方向。
1.2.算法分析
由于每个数字还带有方向这个属性,因些需要使用自己定义数据类型。本算法中用一个结构来表示,结构有两个域,一个代表值,一个代码方向。
算法最大的难点在于,一是判断当前元素是否活动,二是需要找到最大的活动的元素。
通过试验生成过程,可以发现,其中最活跃的元素就是最大的那个元素,因为每交换一个比它小的元素,它都会由不活动状态变成活动状态。因此,在算法的实现上,要格外关注最大的那个元素。事实上,整个算法主要是在将最大的那个元素进行移动。也对最大的那个元素的位置进行了标识。
判断当前元素是否活动,有三种情况是不活动的:
1. 该元素在第一位,并且指向左边。
2. 该元素在最后一位,并且指向右边。
3. 该元素在中间,并且指向的元素比它要大。
通过这三个条件,就可判断当前元素是否活动的。
考虑扩展性,可排列的元素可以不从0开始,也可以不连续。因为排列归根结底是对元素的下标进行排列。因些可考虑让用户自己定义打印算法。
1
#ifndef U8
2
#define U8 unsigned char
3
#endif // U8
4
5
#define DIR_LEFT 0 // 箭头向左
6
#define DIR_RIGHT 1 // 箭头向右
7
8
// 用于输出 一个排列
9
typedef void(*AdjustCallback)(void *const, int size);
10
11
// 一个排列列的元素,它包括数字和这个数字上箭头的方向
12
typedef struct Item
13
}
2
3
4
5
6
7
8
9
10
11
12
13