蓝桥杯-Python

1. 冒泡排序

算法步骤:

  • 比较相邻元素,如果第一个大于第二个则交换
  • 从左往右遍历一遍,重复第一步,可以保证最大的元素在最后面
  • 重复上述操作,可以得到第二大、第三大、...


python 复制代码
n = int(input())
a = list(map(int, input().split()))

# 循环n-1次,每次获得第i大
for i in range(1, n):
    for j in range(0, n - i):
        if a[j] > a[j + 1]:
            a[j], a[j + 1] = a[j + 1], a[j]
print(' '.join(map(str, a)))

2. 选择排序

算法步骤:

  • 从左往右找到最小元素,放在起始位置
  • 重复上述步骤,依次找到第2小、第3小元素...


python 复制代码
n = int(input())
a = list(map(int, input().split()))  # 将一个函数映射到一个或多个迭代器中的所有元素上

for i in range(n - 1):
    min_value = a[i]  # 值
    min_idx = i  # 下标
    for j in range(i, n):
        # 第i次从[i, n-1]找最小值
        if a[j] < min_value:
            min_value = a[j]
            min_idx = j
    # 将最小值放到前面去(将最小值和最前面的元素交换)
    a[min_idx], a[i] = a[i], a[min_idx]

print(' '.join(map(str, a)))

3. 插入排序

算法步骤:

  • 第一个元素看做已排序,从左往右遍历每一个元素;
  • 在已排序元素中从后往前扫描:如果当前元素大于新元素,则该元素移动到后一位
  • 重复第二步直至找到小于等于新元素则停止


python 复制代码
n = int(input())
a = list(map(int, input().split()))

# 对于第i个数字,在区间[0,i-1]中从后往前找对应插入的位置
for i in range(1, n):
    value = a[i]
    # 插入元素的下标
    insert_idx = 0
    for j in range(i - 1, -1, -1):
        if a[j] > value:
            # 往后挪
            a[j + 1] = a[j]
        else:
            insert_idx = j + 1
            break
    # 插入第i个数字
    a[insert_idx] = value
print(' '.join(map(str, a)))

4. 快速排序

算法步骤:

  • 找一个基准值X
  • 把列分成三部分:小于等于X的数字,X, 大于X的数字
  • 左半部分和右半部分递归使用该策略

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续排序,以达到整个序列有序。
快速排序法的最坏情况比较次数是n(n-1)/2。

例如:a=3,5,8,1,2,9,4,7,6

找到基准值3,1,2 , 3, 5,8,9,4,7,6

左半部分1,2作为一个子问题求解

右半部分 5,8,9,4,7,6作为一个子问题求解

python 复制代码
# a[left,right]按照小于等于基准值、基准值、大于基准值排列
def partition(a, left, right):
    # 设置基准值下标:left
    # 放置小于等于基准之元素的下标
    idx = left + 1
    for i in range(left + 1, right + 1):
        # 如果当前元素小于等于基准值,则放到最小元素那边
        if a[i] <= a[left]:
            a[idx], a[i] = a[i], a[idx]
            idx += 1

    # 小于等于基准值的元素为[left+1, idx-1]
    # 最后将基准值放在中间
    a[left], a[idx - 1] = a[idx - 1], a[left]

    # 返回基准值的下标
    return idx - 1


def quicksort(a, left, right):
    if left < right:
        mid = partition(a, left, right)
        quicksort(a, left, mid - 1)
        quicksort(a, mid + 1, right)


n = int(input())
a = list(map(int, input().split()))
quicksort(a, 0, n-1)
print(' '.join(map(str, a)))

5. 归并排序

算法步骤:

  • 先把数组分成两部分
  • 每部分递归处理变成有序
  • 将两个有序列表合并起来



python 复制代码
n = int(input())
a = list(map(int, input().split()))


# 合并两个List
def Merge(A, B):
    result = []
    while len(A) != 0 and len(B) != 0:
        if A[0] <= B[0]:
            result.append(A.pop(0))
        else:
            result.append(B.pop(0))
    result.extend(A)
    result.extend(B)
    return result


def MergeSort(A):
    if len(A) < 2:
        return A
    mid = len(A) // 2
    left = MergeSort(A[:mid])
    right = MergeSort(A[mid:])
    return Merge(left, right)


print(' '.join(map(str, MergeSort(a))))

6. 桶排序




python 复制代码
from itertools import chain


def Bucket_Sort(a, bucketcount):
    minvalue, maxvalue = min(a), max(a)
    # 桶大小
    bucketsize = (maxvalue - minvalue + 1) // bucketcount
    res = [[] for i in range(bucketcount + 1)]
    for x in a:
        idx = (x - minvalue) // bucketsize
        res[idx].append(x)

    # print(res)
    # 每个桶单独排序,可以采用其他排序算法
    for res_x in res:
        res_x.sort()
    return list(chain(*res))


n = int(input())
a = list(map(int, input().split()))

a = Bucket_Sort(a, min(n, 10000))
print(' '.join(map(str, a)))

附加15届省赛全套视频

相关推荐
2601_962099088 分钟前
replit如何运行python
python·代码编辑器·编程环境·在线ide·replit
头发够用的程序员10 分钟前
别被 TOPS 参数迷惑:手把手推导边缘 GPU 整型算力
人工智能·python·ubuntu·计算机视觉·硬件架构·边缘计算
TechWayfarer32 分钟前
做IP归属地查询时总是查不准?IP纯净度检测实战:从“查归属地“到识别“脏IP“的四个维度
服务器·网络·python·tcp/ip·安全·web安全
小溪学编程1 小时前
Java InputStream 详解:从基础到实战
java·python·php
笨笨饿2 小时前
#137_死机恢复现场_Armino平台AP系统swd调试
git·python·stm32·单片机·嵌入式硬件·物联网·vim
2601_962382432 小时前
python常用函数大全pdf-python函数大全.pdf
python·内置函数·io操作·集合操作·数学运算
奈斯先生Vector2 小时前
AIGC 视频生成实战:用 Kling Video 拆解文生视频、图生视频与完整工作流
开发语言·人工智能·windows·python·aigc·音视频
小玮看世界2 小时前
[Python]螺旋遍历 vs 最短路径:方向控制类算法的“同源异流”
开发语言·python·算法
OPEN-F2 小时前
ROS2系列教程:tf2坐标变换详解(C++/Python)
开发语言·c++·python
2601_962097362 小时前
Python工作流实战:SpiffWorkflow深度应用与BPMN自动化指南
python·自动化·工作流·bpmn·spiffworkflow