蓝桥杯宝藏排序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)))
相关推荐
CUMT_DJ39 分钟前
matlab计算算法的运行时间
开发语言·算法·matlab
weixin_514221851 小时前
FDTD与matlab、python耦合
python·学习·matlab·fdtd
KyollBM4 小时前
每日羊题 (质数筛 + 数学 | 构造 + 位运算)
开发语言·c++·算法
F_D_Z6 小时前
数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter
python·torchvision·transforms
Univin6 小时前
C++(10.5)
开发语言·c++·算法
Asmalin6 小时前
【代码随想录day 35】 力扣 01背包问题 一维
算法·leetcode·职场和发展
剪一朵云爱着6 小时前
力扣2779. 数组的最大美丽值
算法·leetcode·排序算法
qq_428639616 小时前
虚幻基础:组件间的联动方式
c++·算法·虚幻
深瞳智检7 小时前
YOLO算法原理详解系列 第002期-YOLOv2 算法原理详解
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
tao3556677 小时前
【Python刷力扣hot100】283. Move Zeroes
开发语言·python·leetcode