第十一届蓝桥杯省赛第二场-----试题 E: 排序

试题 E: 排序(难度:★★★★)15分

【问题描述】 小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序, 总共需要 4 次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。 请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中不可以包含相同的字符。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

思路:

冒泡排序,要求字符串最短,假设完全逆序,设长度为n,则移动次数为 n*(n-1)/2


为什么是n*(n-1)/2呢?原因是这样,我们知道冒泡排序是把数字与相邻的数字比较,把最大的冒泡到最后边。 这里,我们假设这串的长度为n,交换次数最大,即每个数字都需要与相邻的数字交换,从左往右数串的第一位开始冒泡,第一位交换的次数为(n-1)第二位交换的次数为(n-2)…一直到最后一位,交换的总次数为:(n-1)+(n-2)+(n-3)+…+(n-(n-1))= [1+(n-1)]*(n-1)/2


要求移动次数恰好大于100,当n=14时,移动次数为91,当 n=15时,移动次数为105。故确定串长为15个字符。 元素不重复,那么15个字符为abcdefghijklmno 当串为onmlkjihgfedcba时,交换的次数为105次 要求字典序最小,移动100次。 则把第六个字符移动到第一个位置,前五个字符后移一位。

代码:

答案:jonmlkihgfedcba

经验分享 程序员 微信小程序 职场和发展