蓝桥杯宝藏排序2题目(快速,归并,桶排序)

快速排序

找一个基准值x(默认是第一个值),把列表分成三部分:小于等于x的数字,x,大于x的数字左半部分和右半部分递归使用该策略

例: 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 复制代码
def quick_sort(li,left,right):
    if left<right:
        mid=partition(li,left,right)  # 返回下标值,从列表第一个值开始,每次定位在中间值
        quick_sort(li,left,mid-1)
        quick_sort(li,mid+1,right)


def partition(li,left,right):
    tmp=li[left]   # 把第一个值存起来
    while left<right:
        while left<right and li[right]>=tmp:
            right-=1   # 往左走一步
        li[left]=li[right]   # 右边的值写到左边空位上
        while left<right and li[left]<=tmp:
            left+=1
        li[right]=li[left]  # 把左边的值写到右边空位
    li[left]=tmp  # 把tmp归位
    return left  # 返回mid值,left,right都行

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

归并排序

数据结构算法--5 归并排序-CSDN博客 非常详细解答

python 复制代码
def merge(li, low, mid, high):
    i = low
    j = mid + 1
    ltmp = []
    while i <= mid and j <= high:  # 只要两边都有数
        if li[i] < li[j]:
            ltmp.append(li[i])
            i += 1
        else:
            ltmp.append(li[j])
            j += 1
    # 执行完上个while,肯定有一部分没数了
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high + 1] = ltmp


def merge_sort(li, low, high):  # 这里递归就是左右,最后左右一起
    if low < high:  # 至少有两个元素,递归
        mid = (low + high) // 2
        merge_sort(li, low, mid)  # 等其递归完成返回一个左侧有序列表
        merge_sort(li, mid + 1, high)  # 等其递归完返回一个右侧有序列表
        merge(li, low, mid, high)  # 将两个合并


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

桶排序

首先将元素分在不同的桶中,在对每个桶中的元素排序。

python 复制代码
def buckt_sort(li, n=10, max_num=1000):  # n为桶的个数
    buckets = [[] for _ in range(n)]  # 创建桶
    for val in li:
        i = min(val // (max_num // n), n - 1)  # max_num//n为每个桶内的容量,i表示val放到几号桶
        buckets[i].append(val)  # 加入到i号桶
        # 保持桶内的顺序
        for j in range(len(buckets[i]) - 1, 0, -1):  # 步数为-1,反向冒泡排序
            if buckets[i][j] < buckets[i][j - 1]:
                buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]
            else:
                break
    sotr_list = []
    for buc in buckets:  # buc为一个列表(每个桶),一维
        sotr_list.extend(buc)
    return sotr_list


n = int(input())
a = list(map(int, input().split()))
a = buckt_sort(a)
print(' '.join(map(str, a)))
相关推荐
AI视觉网奇6 分钟前
pycharm F2 修改文件名 修改快捷键
ide·python·pycharm
酷爱码7 分钟前
Java -jar命令运行外部依赖JAR包的深度场景分析与实践指南
java·python·jar
WilliamCHW9 分钟前
Pycharm 配置解释器
ide·python·pycharm
abments18 分钟前
基于ReAction范式的问答系统实现demo
开发语言·python
Darkwanderor25 分钟前
数论——同余问题全家桶3 __int128和同余方程组
c++·算法·数论·中国剩余定理
Xyz_Overlord25 分钟前
机器学习——聚类算法
算法·机器学习·聚类
dessler28 分钟前
代理服务器-LVS的3种模式与调度算法
运维·服务器·网络·算法·nginx·tomcat·lvs
拼好饭和她皆失31 分钟前
动态规划 熟悉30题 ---上
算法·动态规划
belong_to_you1 小时前
python模块——tqdm
python
fen_fen1 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法