蓝桥杯宝藏排序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)))
相关推荐
梧桐树04292 小时前
python常用内建模块:collections
python
Dream_Snowar2 小时前
速通Python 第三节
开发语言·python
XH华3 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_3 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子3 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡4 小时前
滑动窗口 + 算法复习
数据结构·算法
蓝天星空4 小时前
Python调用open ai接口
人工智能·python
Lenyiin4 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
jasmine s4 小时前
Pandas
开发语言·python