蓝桥杯宝藏排序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】作为一个子问题求解。

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博客  非常详细解答

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)))

桶排序

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

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)))

相关推荐

  1. 宝藏排序2题目(快速归并排序)

    2023-12-29 18:42:03       42 阅读
  2. -快速排序

    2023-12-29 18:42:03       31 阅读
  3. 快速排序板子(备战

    2023-12-29 18:42:03       37 阅读
  4. 对称排序

    2023-12-29 18:42:03       13 阅读
  5. 2024/2/2 备战 4-1 排序

    2023-12-29 18:42:03       30 阅读
  6. 2024/2/3 备战 4-2 排序

    2023-12-29 18:42:03       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 18:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 18:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 18:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 18:42:03       20 阅读

热门阅读

  1. 蓝桥杯-每日刷题-029

    2023-12-29 18:42:03       36 阅读
  2. 浅识数据库与数据仓库的区别

    2023-12-29 18:42:03       35 阅读
  3. 【AI】图像识别和无人零售

    2023-12-29 18:42:03       35 阅读
  4. Spring Boot笔记2

    2023-12-29 18:42:03       34 阅读
  5. 建造者模式

    2023-12-29 18:42:03       25 阅读
  6. 【3】原型Prototype(创建型)

    2023-12-29 18:42:03       37 阅读