问题描述:
{3,2,2,6,7,8} 排列输出,7不在第二位,68不在一起
算法描述:
本算法基于邻位交换法,使用数字本身而不是索引(即它们在list中下标)作为交换的依据,这样可以有效解决数字2的重复出现问题。至于其他两个限制条件,采用在print的时候过滤掉。
以下描述邻位交换法的文字描述:
前提:
1. 给每个元素定一个方向,初始化为左边。
2.如果一个元素比其方向所指向的邻位元素更大,则该元素定义为活动点。
算法:
0.初始化方向为左边
1.找出最大的活动点,找不到则退出
2.输出当前排列,让最大活动点进行邻位交换,
3.让所有大于最大活动点的元素指向相反方向。
4.流程转入1
上述邻位交换法实际上可以改进,如果让list呈从小到大的排列,则最大的元素将会从list尾部交换到list头部,然后执行上述算法1,2,3步骤,紧接着最大的元素将会从list头部交换到尾部,一直循环下去,,,直到找不到最大的活动点为止
代码: