排序

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序, 总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。

请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中不可以包含相同的字符。
第一步审题,第二步再审题,第三步再审题
注意题中两个特殊条件,限定了范围

1.只包含小写英文字母且没有字母重复出现没有重复字母
2.字典序最小就是a<b,b<c ,相同的情况下,要前面的

分析:在冒泡排序中,肯定是英文小写字母全都倒叙排序次数最多,最坏情况
先看看英文次序:

sum=0
for i in range(26):
    print(chr(   ord('A') +sum ) ,end=" ")
    sum=sum+1

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
假如是DCBA,那么交换结果是:
1.CDBA
2.CBDA
3.BCDA
4.BCAD
5.BACD
6.ABCD
为3+2+1+0=6
如果是:CBA,交换为:
1.BCA
2.BAC
3.ABC
为2+1+0=3
则全部倒叙的为((n-1)+1)(n-1)/2=n(n-1)/2
当n为15时,1514/2=(150+60)=210/2=105
n为14时,14
14-13=183,183/2<100

则结果应该是:

sum=0
a=[]
for i in range(15):
    a.append(   chr( ord('a') +sum ) )
    sum=sum+1
print( " ".join( "%s" %id for id in           a[::-1]))

结果不是这个, o n m l k j i h g f e d c b a ,这个移动次数是105次,只需将a移动?次,
为什么不移动其他的呢?因为a在英文字母里面字典次序最小
建议手算代码作为验证

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值