再论字典序

排列下一个字典序:

 

  1. 从原排列后部开始,对相邻一对进行比较,若前者小于后者,标记前者下标为 j;
  2. 令 k = len - 1, k 递减,寻找到 order[ K ]  > order[  j ] (k > j) ,交换两项;
  3. 对 order[ j + 1 ]  到 order[ k ], 进行从小到大的排序就可以了。 

 

 

 

当然C++里对下一个字典排序是有STL的:

不过对于STL,我的观点是:用之前必须弄明白它的原理。

 

 

 

http://acm.pku.edu.cn/JudgeOnline/problem?id=1256

 

the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'. (初始排列)

求全排列:

 

心得:

  1. 原先错误写地写成cmp()传进去的参数为数组下标(其实应该是字符型的),导致sort()不能正常工作,而且代码写的冗杂,通过一个exist()函数来判断是否存在下一个排列(其实只要通过next()函数的返回值判断就可以了)。sort()函数和exist()函数都要调用cmp()函数,于是没想清楚,参数选错。
  2. cmp()函数通过对两个参数的大小写的判断再进行比较。

 

cmp()

 

 

main()内输出部分:

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值