您当前的位置: 首页 >  Python

2020年第十一届蓝桥杯 - 省赛 - Java研究生组+Java大学B组+Python大学组 - E.排序

发布时间:2022-01-03 17:31:55 ,浏览量:0

在这里插入图片描述

Ideas

冒泡排序在最坏情况下(完全逆序)的交换次数为 c n t = n ( n − 1 ) 2 cnt=\frac{n(n-1)}{2} cnt=2n(n−1),当n=14时,cnt=91,当n=15时,cnt=105。

要求字典序最小,cnt=105代表:由前15个字母组成的逆序排列进行冒泡排序需要交换105次。

15个字母组成的逆序排列:onmlkjihgfedcba,这种情况需要105此交换,所以我们要给它减少5次交换,即将某一位置的字母向前移动5位,为了保证字典序最小,我们把第6位的字母j移动到第1位:jonmlkihgfedcba,也就是说,前5次比较过程不进行位置交换。

然后我们可以写一个冒泡排序验证一下。

Code C++
#include   using namespace std; int bubble_sort_cnt(char arr[], int n) { int cnt = 0; for(int i = n - 1; i > -1; i--) { for(int j = 0; j < i; j++) { if(arr[j] > arr[j + 1]) { cnt++; swap(arr[j], arr[j + 1]); } } } return cnt; } int main() { int n = 15; char a[n] = {'j', 'o', 'n', 'm', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'}; cout << bubble_sort_cnt(a, n); } 
Python
def bubbleSortCnt(arr: list) -> int: cnt = 0 for i in range(len(arr) - 1, -1, -1): for j in range(i): if arr[j] > arr[j + 1]: cnt += 1 arr[j], arr[j + 1] = arr[j + 1], arr[j] return cnt if __name__ == '__main__': print(bubbleSortCnt(list("onmlkjihgfedcba"))) print(bubbleSortCnt(list("jonmlkihgfedcba"))) 
Answer:jonmlkihgfedcba
关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    108697博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0513s