2020年第十一届蓝桥杯 - 省赛 - Java研究生组+Java大学B组+Python大学组 - E.排序
Posted Alex_996
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020年第十一届蓝桥杯 - 省赛 - Java研究生组+Java大学B组+Python大学组 - E.排序相关的知识,希望对你有一定的参考价值。
Ideas
冒泡排序在最坏情况下(完全逆序)的交换次数为 c n t = n ( n − 1 ) 2 cnt=\\fracn(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 <iostream>
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
以上是关于2020年第十一届蓝桥杯 - 省赛 - Java研究生组+Java大学B组+Python大学组 - E.排序的主要内容,如果未能解决你的问题,请参考以下文章
2020年第十一届蓝桥杯 - 省赛 - Python大学组 - F.成绩统计